Beispiel #1
0
        /// <summary>Register IPublisher[TMessage] and ISubscriber[TMessage](includes Async/Buffered) to container builder.</summary>
        public static DiContainer BindMessageBroker <TMessage>(this DiContainer builder, MessagePipeOptions options)
        {
            var lifetime = options.InstanceLifetime;
            var services = new DiContainerProxy(builder);

            // keyless PubSub
            services.Add(typeof(MessageBrokerCore <TMessage>), lifetime);
            services.Add(typeof(IPublisher <TMessage>), typeof(MessageBroker <TMessage>), lifetime);
            services.Add(typeof(ISubscriber <TMessage>), typeof(MessageBroker <TMessage>), lifetime);

            // keyless PubSub async
            services.Add(typeof(AsyncMessageBrokerCore <TMessage>), lifetime);
            services.Add(typeof(IAsyncPublisher <TMessage>), typeof(AsyncMessageBroker <TMessage>), lifetime);
            services.Add(typeof(IAsyncSubscriber <TMessage>), typeof(AsyncMessageBroker <TMessage>), lifetime);

            // keyless buffered PubSub
            services.Add(typeof(BufferedMessageBrokerCore <TMessage>), lifetime);
            services.Add(typeof(IBufferedPublisher <TMessage>), typeof(BufferedMessageBroker <TMessage>), lifetime);
            services.Add(typeof(IBufferedSubscriber <TMessage>), typeof(BufferedMessageBroker <TMessage>), lifetime);

            // keyless buffered PubSub async
            services.Add(typeof(BufferedAsyncMessageBrokerCore <TMessage>), lifetime);
            services.Add(typeof(IBufferedAsyncPublisher <TMessage>), typeof(BufferedAsyncMessageBroker <TMessage>), lifetime);
            services.Add(typeof(IBufferedAsyncSubscriber <TMessage>), typeof(BufferedAsyncMessageBroker <TMessage>), lifetime);

            return(builder);
        }
Beispiel #2
0
        public static MessagePipeOptions BindMessagePipe(this DiContainer builder, Action <MessagePipeOptions> configure)
        {
            MessagePipeOptions options = null;
            var proxy = new DiContainerProxy(builder);

            proxy.AddMessagePipe(x =>
            {
                configure(x);
                options = x;

                // Zenject 6 does not allow regsiter multiple singleton, it causes annoying error.
                // https://github.com/modesttree/Zenject#upgrade-guide-for-zenject-6
                // so force use Scoped.
                options.InstanceLifetime = (options.InstanceLifetime == InstanceLifetime.Singleton)
                    ? InstanceLifetime.Scoped
                    : options.InstanceLifetime;
                options.RequestHandlerLifetime = (options.RequestHandlerLifetime == InstanceLifetime.Singleton)
                    ? InstanceLifetime.Scoped
                    : options.RequestHandlerLifetime;
            });

            builder.Bind <IServiceProvider>().To <DiContainerProviderProxy>().AsCached();

            return(options);
        }
Beispiel #3
0
        /// <summary>Register IAsyncRequestHandler[TRequest, TResponse](includes All) to container builder.</summary>
        public static DiContainer BindAsyncRequestHandler <TRequest, TResponse, THandler>(this DiContainer builder, MessagePipeOptions options)
            where THandler : IAsyncRequestHandler
        {
            var lifetime = options.InstanceLifetime;
            var services = new DiContainerProxy(builder);

            services.Add(typeof(IAsyncRequestHandlerCore <TRequest, TResponse>), typeof(THandler), lifetime);
            if (!builder.HasBinding <IAsyncRequestHandler <TRequest, TResponse> >())
            {
                services.Add(typeof(IAsyncRequestHandler <TRequest, TResponse>), typeof(AsyncRequestHandler <TRequest, TResponse>), lifetime);
                services.Add(typeof(IAsyncRequestAllHandler <TRequest, TResponse>), typeof(AsyncRequestAllHandler <TRequest, TResponse>), lifetime);
            }
            return(builder);
        }