using System; using VContainer; using MessagePipe.VContainer; namespace MessagePipe { public static class ContainerBuilderExtensions { // original is ServiceCollectionExtensions, trimed openegenerics register. public static MessagePipeOptions RegisterMessagePipe(this IContainerBuilder builder) { return RegisterMessagePipe(builder, _ => { }); } public static MessagePipeOptions RegisterMessagePipe(this IContainerBuilder builder, Action configure) { MessagePipeOptions options = null; var proxy = new ContainerBuilderProxy(builder); proxy.AddMessagePipe(x => { configure(x); options = x; }); builder.Register(Lifetime.Scoped); return options; } /// Register IPublisher[TMessage] and ISubscriber[TMessage](includes Async/Buffered) to container builder. public static IContainerBuilder RegisterMessageBroker(this IContainerBuilder builder, MessagePipeOptions options) { var lifetime = GetLifetime(options.InstanceLifetime); var services = new ContainerBuilderProxy(builder); // keyless PubSub services.Add(typeof(MessageBrokerCore), lifetime); services.Add(typeof(IPublisher), typeof(MessageBroker), lifetime); services.Add(typeof(ISubscriber), typeof(MessageBroker), lifetime); // keyless PubSub async services.Add(typeof(AsyncMessageBrokerCore), lifetime); services.Add(typeof(IAsyncPublisher), typeof(AsyncMessageBroker), lifetime); services.Add(typeof(IAsyncSubscriber), typeof(AsyncMessageBroker), lifetime); // keyless buffered PubSub services.Add(typeof(BufferedMessageBrokerCore), lifetime); services.Add(typeof(IBufferedPublisher), typeof(BufferedMessageBroker), lifetime); services.Add(typeof(IBufferedSubscriber), typeof(BufferedMessageBroker), lifetime); // keyless buffered PubSub async services.Add(typeof(BufferedAsyncMessageBrokerCore), lifetime); services.Add(typeof(IBufferedAsyncPublisher), typeof(BufferedAsyncMessageBroker), lifetime); services.Add(typeof(IBufferedAsyncSubscriber), typeof(BufferedAsyncMessageBroker), lifetime); return builder; } /// Register IPublisher[TKey, TMessage] and ISubscriber[TKey, TMessage](includes Async) to container builder. public static IContainerBuilder RegisterMessageBroker(this IContainerBuilder builder, MessagePipeOptions options) { var lifetime = GetLifetime(options.InstanceLifetime); var services = new ContainerBuilderProxy(builder); // keyed PubSub services.Add(typeof(MessageBrokerCore), lifetime); services.Add(typeof(IPublisher), typeof(MessageBroker), lifetime); services.Add(typeof(ISubscriber), typeof(MessageBroker), lifetime); // keyed PubSub async services.Add(typeof(AsyncMessageBrokerCore), lifetime); services.Add(typeof(IAsyncPublisher), typeof(AsyncMessageBroker), lifetime); services.Add(typeof(IAsyncSubscriber), typeof(AsyncMessageBroker), lifetime); return builder; } /// Register IRequestHandler[TRequest, TResponse](includes All) to container builder. public static IContainerBuilder RegisterRequestHandler(this IContainerBuilder builder, MessagePipeOptions options) where THandler : IRequestHandler { var lifetime = GetLifetime(options.RequestHandlerLifetime); var services = new ContainerBuilderProxy(builder); services.Add(typeof(IRequestHandlerCore), typeof(THandler), lifetime); if (!builder.Exists(typeof(IRequestHandler), true)) { services.Add(typeof(IRequestHandler), typeof(RequestHandler), lifetime); services.Add(typeof(IRequestAllHandler), typeof(RequestAllHandler), lifetime); } return builder; } /// Register IAsyncRequestHandler[TRequest, TResponse](includes All) to container builder. public static IContainerBuilder RegisterAsyncRequestHandler(this IContainerBuilder builder, MessagePipeOptions options) where THandler : IAsyncRequestHandler { var lifetime = GetLifetime(options.RequestHandlerLifetime); var services = new ContainerBuilderProxy(builder); services.Add(typeof(IAsyncRequestHandlerCore), typeof(THandler), lifetime); if (!builder.Exists(typeof(IAsyncRequestHandler), true)) { services.Add(typeof(IAsyncRequestHandler), typeof(AsyncRequestHandler), lifetime); services.Add(typeof(IAsyncRequestAllHandler), typeof(AsyncRequestAllHandler), lifetime); } AsyncRequestHandlerRegistory.Add(typeof(TRequest), typeof(TResponse), typeof(THandler)); return builder; } public static IContainerBuilder RegisterMessageHandlerFilter(this IContainerBuilder builder) where T : class, IMessageHandlerFilter { if (!builder.Exists(typeof(T), true)) { builder.Register(Lifetime.Transient); } return builder; } public static IContainerBuilder RegisterAsyncMessageHandlerFilter(this IContainerBuilder builder) where T : class, IAsyncMessageHandlerFilter { if (!builder.Exists(typeof(T), true)) { builder.Register(Lifetime.Transient); } return builder; } public static IContainerBuilder RegisterRequestHandlerFilter(this IContainerBuilder builder) where T : class, IRequestHandlerFilter { if (!builder.Exists(typeof(T), true)) { builder.Register(Lifetime.Transient); } return builder; } public static IContainerBuilder RegisterAsyncRequestHandlerFilter(this IContainerBuilder builder) where T : class, IAsyncRequestHandlerFilter { if (!builder.Exists(typeof(T), true)) { builder.Register(Lifetime.Transient); } return builder; } public static IServiceCollection AsServiceCollection(this IContainerBuilder builder) { return new ContainerBuilderProxy(builder); } public static IMessagePipeBuilder ToMessagePipeBuilder(this IContainerBuilder builder) { return new MessagePipeBuilder(builder.AsServiceCollection()); } static Lifetime GetLifetime(InstanceLifetime lifetime) { return (lifetime == InstanceLifetime.Scoped) ? Lifetime.Scoped : (lifetime == InstanceLifetime.Singleton) ? Lifetime.Singleton : Lifetime.Transient; } } }