Ejemplo n.º 1
0
            public async Task <IHandlerRegistration> RegisterAsync(IContextualProvider <IMessageHandler <TMessage> > handlerProvider)
            {
                var provider = new ContextualProvider <IMessageReplyer <TMessage> >(
                    serviceProvider => new MessageReplyer <TMessage>(_endPoint, handlerProvider.ProvideInstance(serviceProvider)));

                return(await HandlerRegistration.CreateRegistrationAsync(_handler, provider));
            }
Ejemplo n.º 2
0
        public async Task <IHandlerRegistration> RegisterAsync <TEvent, TEntity>(IContextualProvider <IEventReplayer <TId, TEventBase, TEntityBase, TEvent, TEntity> > eventReplayerFactory)
            where TEvent : TEventBase
            where TEntity : TEntityBase
        {
            if (eventReplayerFactory == null)
            {
                throw new ArgumentNullException(nameof(eventReplayerFactory));
            }

            IAsyncSingleHandlerRegistry <IEventReplayer <TId, TEventBase, TEntityBase> > handlerRegistry;

            ImmutableDictionary <Type, ImmutableDictionary <Type, IAsyncSingleHandlerRegistry <IEventReplayer <TId, TEventBase, TEntityBase> > > > current = _replayer,
                                                                                                                                                   start,
                                                                                                                                                   desired;

            do
            {
                start = current;

                if (start.TryGetValue(typeof(TEvent), out var perEventRegistry) &&
                    perEventRegistry.TryGetValue(typeof(TEntity), out handlerRegistry))
                {
                    break;
                }

                desired          = start.Remove(typeof(TEvent));
                handlerRegistry  = new AsyncSingleHandlerRegistry <IEventReplayer <TId, TEventBase, TEntityBase> >();
                perEventRegistry = (perEventRegistry ?? ImmutableDictionary <Type, IAsyncSingleHandlerRegistry <IEventReplayer <TId, TEventBase, TEntityBase> > > .Empty)
                                   .Add(typeof(TEntity), handlerRegistry);
                desired = desired.Add(typeof(TEvent), perEventRegistry);
                current = Interlocked.CompareExchange(ref _replayer, desired, start);
            }while (current != start);

            var untypedFactory = new EventReplayerFactory <TEvent, TEntity>(eventReplayerFactory);

            return(await HandlerRegistration.CreateRegistrationAsync(handlerRegistry, untypedFactory));
        }