Exemple #1
0
 public static void RegisterEventHandlers(IServiceProvider serviceProvider, MultiMessageHandlerRegistration register)
 {
     register.RegisterEventHandler <MatchStartedEvent>(() => new MatchEventHandlers(serviceProvider.GetRequiredService <IMatchReadStackRepository>()));
     register.RegisterEventHandler <MatchEndedEvent>(() => new MatchEventHandlers(serviceProvider.GetRequiredService <IMatchReadStackRepository>()));
     register.RegisterEventHandler <DeployedEvent>(() => new MatchEventHandlers(serviceProvider.GetRequiredService <IMatchReadStackRepository>()));
     register.RegisterEventHandler <DestroyedEvent>(() => new MatchEventHandlers(serviceProvider.GetRequiredService <IMatchReadStackRepository>()));
 }
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Swagger.
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info {
                    Title = "AspNetCore Basic Registration Sample", Version = "v1"
                });
                c.IncludeXmlComments(AspNetCoreAppXmlDocPath);
            });

            // Write-side repository.
            services.AddSingleton <IAggregateRootRepository <Product> >((serviceProvider) =>
                                                                        new PublishingAggregateRootRepository <Product>(new InMemoryAggregateRootRepository <Product>(),
                                                                                                                        serviceProvider.GetRequiredService <IDomainEventPublisher>())
                                                                        );

            // Domain event publisher.
            services.AddSingleton <IDomainEventPublisher, DomainEventPublisher>();

            // Read-side repository.
            services.AddSingleton <IProductReadSideRepository, InMemoryProductReadSideRepository>();

            // Register command delegator.
            services.AddSingleton <CommandDelegator>(serviceProvider =>
            {
                // Register command handlers.
                var commandHandlerRegistration = new SingleMessageHandlerRegistration();
                commandHandlerRegistration.RegisterCommandHandler(() => new RegisterProductCommandHandler(serviceProvider.GetRequiredService <IAggregateRootRepository <Product> >()));
                commandHandlerRegistration.RegisterCommandHandler(() => new ActivateProductCommandHandler(serviceProvider.GetRequiredService <IAggregateRootRepository <Product> >()));
                commandHandlerRegistration.RegisterCommandHandler(() => new DeactivateProductCommandHandler(serviceProvider.GetRequiredService <IAggregateRootRepository <Product> >()));

                return(new CommandDelegator(commandHandlerRegistration.BuildMessageHandlerResolver()));
            });

            // Register event delegator.
            services.AddSingleton <EventDelegator>((serviceProvider) =>
            {
                // Register event handlers.
                var eventHandlerRegistration = new MultiMessageHandlerRegistration();
                eventHandlerRegistration.RegisterEventHandler <ProductRegisteredEvent>(() => new ProductDomainEventsHandler(serviceProvider.GetRequiredService <IProductReadSideRepository>()));
                eventHandlerRegistration.RegisterEventHandler <ProductActivatedEvent>(() => new ProductDomainEventsHandler(serviceProvider.GetRequiredService <IProductReadSideRepository>()));
                eventHandlerRegistration.RegisterEventHandler <ProductDeactivatedEvent>(() => new ProductDomainEventsHandler(serviceProvider.GetRequiredService <IProductReadSideRepository>()));

                return(new EventDelegator(eventHandlerRegistration.BuildMessageHandlerResolver()));
            });

            // Register query dispatcher.
            services.AddSingleton <IQueryAsyncDispatcher>(serviceProvider =>
            {
                // Register query handlers.
                var registration = new QueryHandlerRegistration();
                registration.Register(() => new QueryAllProductsHandler(serviceProvider.GetRequiredService <IProductReadSideRepository>()));
                registration.Register(() => new QueryProductByIdHandler(serviceProvider.GetRequiredService <IProductReadSideRepository>()));

                return(new QueryDispatcher(registration));
            });

            services.AddMvc();
        }
Exemple #3
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Swagger.
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info {
                    Title = "AspNetCore Mixed Registration Sample", Version = "v1"
                });
                c.IncludeXmlComments(AspNetCoreAppXmlDocPath);
            });

            // Write-side repository.
            services.AddSingleton <IProductRepository>((serviceProvider) =>
                                                       new PublishingProductRepository(new InMemoryProductRepository(), serviceProvider.GetRequiredService <EventDelegator>())
                                                       );

            // Read-side repository.
            services.AddSingleton <IProductReadSideRepository, InMemoryProductReadSideRepository>();

            // Register command delegator.
            services.AddSingleton <CommandDelegator>((serviceProvider) =>
            {
                // Register command handlers through simple registration.
                var commandHandlerRegistration = new SingleMessageHandlerRegistration();
                commandHandlerRegistration.RegisterCommandHandler(() => new RegisterProductCommandHandler(serviceProvider.GetRequiredService <IProductRepository>()));
                commandHandlerRegistration.RegisterCommandHandler(() => new ActivateProductCommandHandler(serviceProvider.GetRequiredService <IProductRepository>()));
                commandHandlerRegistration.RegisterCommandHandler(() => new DeactivateProductCommandHandler(serviceProvider.GetRequiredService <IProductRepository>()));

                return(new CommandDelegator(commandHandlerRegistration.BuildMessageHandlerResolver()));
            });

            // Register event delegator.
            services.AddSingleton <EventDelegator>((serviceProvider) =>
            {
                // Register event handlers through simple registration.
                var eventHandlerRegistration = new MultiMessageHandlerRegistration();
                eventHandlerRegistration.RegisterEventHandler <ProductRegisteredEvent>(() => new ProductDomainEventsHandler(serviceProvider.GetRequiredService <IProductReadSideRepository>()));
                eventHandlerRegistration.RegisterEventHandler <ProductActivatedEvent>(() => new ProductDomainEventsHandler(serviceProvider.GetRequiredService <IProductReadSideRepository>()));
                eventHandlerRegistration.RegisterEventHandler <ProductDeactivatedEvent>(() => new ProductDomainEventsHandler(serviceProvider.GetRequiredService <IProductReadSideRepository>()));

                return(new EventDelegator(eventHandlerRegistration.BuildMessageHandlerResolver()));
            });

            // Register query handlers to container.
            services.AddTransient <IQueryAsyncHandler <QueryAllProducts, IReadOnlyCollection <ProductReadModel> >, QueryAllProductsHandler>();
            services.AddTransient <IQueryAsyncHandler <QueryProductById, ProductReadModel>, QueryProductByIdHandler>();

            // Register query dispatcher.
            services.AddSingleton <IQueryAsyncDispatcher>(serviceProvider =>
                                                          new QueryDispatcher(new ContainerQueryAsyncHandlerResolver(new AspNetCoreServiceProviderAdapter(serviceProvider)))
                                                          );

            services.AddMvc();
        }
Exemple #4
0
        public static void RegisterEventHandlers(IServiceProvider serviceProvider, MultiMessageHandlerRegistration register)
        {
            //rather than lazy's this should probably go through a handler that goes to a singleton saga like the query side does with the repo, but this works too
            //game saga
            var gameSaga = new Lazy <GameSaga>(() => new GameSaga(serviceProvider.GetRequiredService <CommandDelegator>()));

            register.RegisterEventHandler <MatchStartedEvent>(() => gameSaga.Value);
            register.RegisterEventHandler <DeployedEvent>(() => gameSaga.Value);
            register.RegisterEventHandler <DestroyedEvent>(() => gameSaga.Value);

            //match turn saga
            var matchTurnSaga = new Lazy <MatchTurnSaga>(() => new MatchTurnSaga(serviceProvider.GetRequiredService <CommandDelegator>()));

            register.RegisterEventHandler <AllPlayerMovesSubmittedForTurnEvent>(() => matchTurnSaga.Value);
        }
            public async Task ShouldRegisterAllEventHandlers()
            {
                // 6 handlers.
                var asyncHandler1 = new TestEventHandler(_outputHelper);
                var asyncHandler2 = new TestEventHandler(_outputHelper);
                var asyncHandler3 = new TestEventHandler(_outputHelper);
                var handler1      = new TestEventHandler(_outputHelper);
                var handler2      = new TestEventHandler(_outputHelper);
                var handler3      = new TestEventHandler(_outputHelper);

                var registration = new MultiMessageHandlerRegistration();

                registration.RegisterEventHandler <TestEvent1>(() => asyncHandler1);
                registration.RegisterEventHandler <TestEvent1>(() => asyncHandler2);
                registration.RegisterEventHandler <TestEvent1>(() => asyncHandler3);
                registration.RegisterEventHandler <TestEvent1>(() => handler1.AsEventSyncHandler <TestEvent1>());
                registration.RegisterEventHandler <TestEvent1>(() => handler2.AsEventSyncHandler <TestEvent1>());
                registration.RegisterEventHandler <TestEvent1>(() => handler3.AsEventSyncHandler <TestEvent1>());

                IMessageHandlerResolver resolver = registration.BuildMessageHandlerResolver();

                MessageHandlerDelegate eventHandlerDelegate = resolver.ResolveMessageHandler(typeof(TestEvent1));

                await eventHandlerDelegate.Invoke(new TestEvent1());

                int totalEventsHandledCount = asyncHandler1.HandledEvents.Count +
                                              asyncHandler2.HandledEvents.Count +
                                              asyncHandler3.HandledEvents.Count +
                                              handler1.HandledEvents.Count +
                                              handler2.HandledEvents.Count +
                                              handler3.HandledEvents.Count;

                totalEventsHandledCount.Should().Be(6);
            }