public static IServiceCollection AddMessageHandlers(this IServiceCollection services) { void RegisterHandler <TMessageType, THandler>() where TMessageType : class where THandler : IMessageHandler <TMessageType> { services.AddSingleton <TMessageType>(); services.AddSingleton( serviceProvider => new MessageHandlerWrapper <TMessageType>(serviceProvider.GetService <THandler>()) ); } // MessageTypeOneHandler is the implementation of IMessageHandler<MessageTypeOne> RegisterHandler <MessageTypeOne, MessageTypeOneHandler>(); RegisterHandler <MessageTypeTwo, MessageTypeTwoHandler>(); // some string constants for message types would be better. services.AddSingleton <IMessageHandlerFactory>(serviceProvider => { var factory = new MessageHandlerFactory(); factory.RegisterHandler("messagetypeone", serviceProvider.GetService <MessageHandlerWrapper <MessageTypeOne> >); factory.RegisterHandler("messagetypetwo", serviceProvider.GetService <MessageHandlerWrapper <MessageTypeTwo> >); return(factory); }); services.AddSingleton <IMessageHandler, MessageRouter>(); return(services); }
public static IServiceCollection AddMessageHandlers(this IServiceCollection services) { services.RegisterHandler <MessageOne, MessageOneHandler>(); services.RegisterHandler <MessageTwo, MessageTwoHandler>(); // some string constants for message types would be better. services.AddSingleton <IMessageHandlerFactory>(serviceProvider => { var factory = new MessageHandlerFactory(); factory.RegisterHandler("MessageOne", serviceProvider.GetService <MessageHandlerWrapper <MessageOne> >); factory.RegisterHandler("MessageTwo", serviceProvider.GetService <MessageHandlerWrapper <MessageTwo> >); return(factory); }); services.AddSingleton <IMessageHandler, MessageRouter>(); return(services); }