using System.Collections.Concurrent; namespace zero.Communication; public class MessageAggregator : IMessageAggregator { readonly ConcurrentBag Subscription = new ConcurrentBag(); readonly IServiceProvider ServiceProvider; public MessageAggregator(IServiceProvider serviceProvider) { ServiceProvider = serviceProvider; } /// public async Task Publish(TMessage message) where TMessage : class, IMessage { IEnumerable subscriptions = Subscription.Where(s => s.CanDeliver()); foreach (IMessageSubscription subscription in subscriptions) { await subscription.Deliver(ServiceProvider, message); } } /// public void Subscribe() where TMessage : class, IMessage where TMessageHandler : IMessageHandler { Subscription.Add(new MessageSubscription()); } } public interface IMessageAggregator { /// /// Publishes the specified message, invoking any handlers subscribed to the message. /// Task Publish(TMessage message) where TMessage : class, IMessage; /// /// Subscribes the specified handler to the spified message type /// void Subscribe() where TMessage : class, IMessage where TMessageHandler : IMessageHandler; }