コード例 #1
0
 public MessageBrokerCore(MessagePipeDiagnosticsInfo diagnotics, MessagePipeOptions options)
 {
     this.handlerGroup = new Dictionary <TKey, HandlerHolder>();
     this.diagnotics   = diagnotics;
     this.handlingSubscribeDisposedPolicy = options.HandlingSubscribeDisposedPolicy;
     this.gate = new object();
 }
コード例 #2
0
 public AsyncMessageBrokerCore(MessagePipeDiagnosticsInfo diagnotics, MessagePipeOptions options)
 {
     this.handlers = new FreeList <IAsyncMessageHandler <TMessage> >();
     this.defaultAsyncPublishStrategy     = options.DefaultAsyncPublishStrategy;
     this.handlingSubscribeDisposedPolicy = options.HandlingSubscribeDisposedPolicy;
     this.diagnotics = diagnotics;
 }
コード例 #3
0
 public MessagePipeDiagnosticsInfo(MessagePipeOptions options)
 {
     if (options.EnableCaptureStackTrace)
     {
         enableCaptureStackTrace = true;
     }
 }
コード例 #4
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);
        }
コード例 #5
0
ファイル: EventFactory.cs プロジェクト: dav1977/MessagePipe
 public EventFactory(
     MessagePipeOptions options,
     MessagePipeDiagnosticsInfo diagnosticsInfo,
     FilterAttachedMessageHandlerFactory handlerFactory,
     FilterAttachedAsyncMessageHandlerFactory asyncHandlerFactory)
 {
     this.options             = options;
     this.diagnosticsInfo     = diagnosticsInfo;
     this.handlerFactory      = handlerFactory;
     this.asyncHandlerFactory = asyncHandlerFactory;
 }
コード例 #6
0
        public static MessagePipeOptions RegisterMessagePipe(this IContainerBuilder builder, Action <MessagePipeOptions> configure)
        {
            MessagePipeOptions options = null;
            var proxy = new ContainerBuilderProxy(builder);

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

            builder.Register <IServiceProvider, ObjectResolverProxy>(Lifetime.Scoped);

            return(options);
        }
コード例 #7
0
 public ScopedAsyncMessageBrokerCore(MessagePipeDiagnosticsInfo diagnotics, MessagePipeOptions options)
     : base(diagnotics, options)
 {
 }
コード例 #8
0
 public FilterAttachedAsyncMessageHandlerFactory(MessagePipeOptions options, AttributeFilterProvider <AsyncMessageHandlerFilterAttribute> filterProvider, IServiceProvider provider)
 {
     this.options        = options;
     this.filterProvider = filterProvider;
     this.provider       = provider;
 }
コード例 #9
0
        public AsyncRequestAllHandler(IEnumerable <IAsyncRequestHandlerCore <TRequest, TResponse> > handlers, FilterAttachedAsyncRequestHandlerFactory handlerFactory, MessagePipeOptions options)
        {
            var collection = (handlers as ICollection <IAsyncRequestHandlerCore <TRequest, TResponse> >) ?? handlers.ToArray();

            var array = new IAsyncRequestHandlerCore <TRequest, TResponse> [collection.Count];
            var i     = 0;

            foreach (var item in collection)
            {
                array[i++] = handlerFactory.CreateAsyncRequestHandler(item);
            }

            this.handlers = array;
            this.defaultAsyncPublishStrategy = options.DefaultAsyncPublishStrategy;
        }
コード例 #10
0
 public SingletonMessageBrokerCore(MessagePipeDiagnosticsInfo diagnotics, MessagePipeOptions options)
     : base(diagnotics, options)
 {
 }
コード例 #11
0
        /// <summary>Register IPublisher[TKey, TMessage] and ISubscriber[TKey, TMessage](includes Async) to container builder.</summary>
        public static DiContainer BindMessageBroker <TKey, TMessage>(this DiContainer builder, MessagePipeOptions options)
        {
            var lifetime = options.InstanceLifetime;
            var services = new DiContainerProxy(builder);

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

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

            return(builder);
        }
コード例 #12
0
        /// <summary>Register IAsyncRequestHandler[TRequest, TResponse](includes All) to container builder.</summary>
        public static IContainerBuilder RegisterAsyncRequestHandler <TRequest, TResponse, THandler>(this IContainerBuilder builder, MessagePipeOptions options)
            where THandler : IAsyncRequestHandler
        {
            var lifetime = GetLifetime(options);
            var services = new ContainerBuilderProxy(builder);

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

            return(builder);
        }
コード例 #13
0
        /// <summary>Register IPublisher[TKey, TMessage] and ISubscriber[TKey, TMessage](includes Async) to container builder.</summary>
        public static IContainerBuilder RegisterMessageBroker <TKey, TMessage>(this IContainerBuilder builder, MessagePipeOptions options)
        {
            var lifetime = GetLifetime(options);
            var services = new ContainerBuilderProxy(builder);

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

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

            return(builder);
        }
コード例 #14
0
 static Lifetime GetLifetime(MessagePipeOptions options)
 {
     return(options.InstanceLifetime == InstanceLifetime.Scoped ? Lifetime.Scoped : Lifetime.Singleton);
 }
コード例 #15
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);
        }
コード例 #16
0
 public MessagePipeDiagnosticsInfo(MessagePipeOptions options)
 {
     this.options = options;
 }
コード例 #17
0
ファイル: MessageBroker.cs プロジェクト: dav1977/MessagePipe
 public MessageBrokerCore(MessagePipeDiagnosticsInfo diagnotics, MessagePipeOptions options)
 {
     this.handlers = new FreeList <IMessageHandler <TMessage> >();
     this.handlingSubscribeDisposedPolicy = options.HandlingSubscribeDisposedPolicy;
     this.diagnotics = diagnotics;
 }
コード例 #18
0
        public static IServiceCollection AddMessagePipe(this IServiceCollection services, Action <MessagePipeOptions> configure)
        {
            var options = new MessagePipeOptions();

            configure(options);
            services.AddSingleton(options); // add as singleton instance
            services.AddSingleton(typeof(MessagePipeDiagnosticsInfo));
            services.AddSingleton(typeof(EventFactory));

            // filters.
            // attribute and order is deterministic at compile, so use Singleton lifetime of cache.
            services.AddSingleton(typeof(AttributeFilterProvider <MessageHandlerFilterAttribute>));
            services.AddSingleton(typeof(AttributeFilterProvider <AsyncMessageHandlerFilterAttribute>));
            services.AddSingleton(typeof(AttributeFilterProvider <RequestHandlerFilterAttribute>));
            services.AddSingleton(typeof(AttributeFilterProvider <AsyncRequestHandlerFilterAttribute>));
            services.AddSingleton(typeof(FilterAttachedMessageHandlerFactory));
            services.AddSingleton(typeof(FilterAttachedAsyncMessageHandlerFactory));
            services.AddSingleton(typeof(FilterAttachedRequestHandlerFactory));
            services.AddSingleton(typeof(FilterAttachedAsyncRequestHandlerFactory));
            foreach (var item in options.GetGlobalFilterTypes())
            {
                services.TryAddTransient(item); // filter itself is Transient
            }

#if !UNITY_2018_3_OR_NEWER
            // open generics implemntations(.NET Only)

            {
                var lifetime = options.InstanceLifetime; // pubsub lifetime

                // keyless PubSub
                services.Add(typeof(MessageBrokerCore <>), lifetime);
                services.Add(typeof(IPublisher <>), typeof(MessageBroker <>), lifetime);
                services.Add(typeof(ISubscriber <>), typeof(MessageBroker <>), lifetime);
                services.Add(typeof(BufferedMessageBrokerCore <>), lifetime);
                services.Add(typeof(IBufferedPublisher <>), typeof(BufferedMessageBroker <>), lifetime);
                services.Add(typeof(IBufferedSubscriber <>), typeof(BufferedMessageBroker <>), lifetime);

                // keyless PubSub async
                services.Add(typeof(AsyncMessageBrokerCore <>), lifetime);
                services.Add(typeof(IAsyncPublisher <>), typeof(AsyncMessageBroker <>), lifetime);
                services.Add(typeof(IAsyncSubscriber <>), typeof(AsyncMessageBroker <>), lifetime);
                services.Add(typeof(BufferedAsyncMessageBrokerCore <>), lifetime);
                services.Add(typeof(IBufferedAsyncPublisher <>), typeof(BufferedAsyncMessageBroker <>), lifetime);
                services.Add(typeof(IBufferedAsyncSubscriber <>), typeof(BufferedAsyncMessageBroker <>), lifetime);

                // 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);
            }

            var lifetime2 = options.RequestHandlerLifetime; // requesthandler lifetime

            // RequestHandler
            services.Add(typeof(IRequestHandler <,>), typeof(RequestHandler <,>), lifetime2);
            services.Add(typeof(IAsyncRequestHandler <,>), typeof(AsyncRequestHandler <,>), lifetime2);

            // RequestAll
            services.Add(typeof(IRequestAllHandler <,>), typeof(RequestAllHandler <,>), lifetime2);
            services.Add(typeof(IAsyncRequestAllHandler <,>), typeof(AsyncRequestAllHandler <,>), lifetime2);

            // auto registration is .NET only.
            if (options.EnableAutoRegistration)
            {
                // auto register filter and requesthandler
                // request handler is option's lifetime, filter is transient
                if (options.autoregistrationAssemblies == null && options.autoregistrationTypes == null)
                {
                    AddRequestHandlerAndFilterFromTypes(services, lifetime2, TypeCollector.CollectFromCurrentDomain());
                }
                else
                {
                    var fromAssemblies = (options.autoregistrationAssemblies != null)
                        ? TypeCollector.CollectFromAssemblies(options.autoregistrationAssemblies)
                        : Enumerable.Empty <Type>();
                    var types = options.autoregistrationTypes ?? Enumerable.Empty <Type>();

                    AddRequestHandlerAndFilterFromTypes(services, lifetime2, fromAssemblies.Concat(types).Distinct());
                }
            }
#endif

            return(services);
        }