public void Context()
        {
            HttpContext.Current = FakeHttpContextHelper.GetFakeHttpContext();

            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (TestDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory);

            _volatileResourceManager = new VolatileResourceManager();

            var unitOfWorkFactory = IoC.Resolve <IUnitOfWorkFactory>();

            TransactionScopeUnitOfWorkHttpModule.Initialize(
                unitOfWorkFactory: unitOfWorkFactory,
                transactionScopeEnlistmentAction: transactionScope => _volatileResourceManager.EnlistIntoTransactionScope(transactionScope)
                );
            var transactionScopeUnitOfWorkHttpModule = new TransactionScopeUnitOfWorkHttpModule();
            var httpApplication = new FakeHttpApplication();

            transactionScopeUnitOfWorkHttpModule.Init(httpApplication);

            httpApplication.FireBeginRequest();

            _simulateApplicationTransaction();

            httpApplication.FireEndRequest();
        }
示例#2
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();

            app.UseRebus();

            app.UseMiddleware <TransactionScopeUnitOfWorkDependencyInjectionMiddleware>(System.Transactions.IsolationLevel.ReadCommitted);

            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

            DomainEvents.Initialize(app.ApplicationServices.GetService <IDomainEventHandlerFactory>());

            _BuildDatabase(app);
        }
        public async Task Context()
        {
            var specification = new TTransactionScopeUnitOfWorkMiddlewareSpecification();

            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (TestDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory);

            _volatileResourceManager = new VolatileResourceManager();

            async Task _requestDelegate(HttpContext context)
            {
                _entityRepository = IoC.Resolve <IRepository <TestEntityWithDomainEvent> >();

                _entity = new TestEntityWithDomainEvent();
                _entity.BehaviouralMethodWithRaisingDomainEvent();

                await _entityRepository.SaveAsync(_entity);

                _volatileResourceManager.SetMemberValue(23);

                throw new NotSupportedException("test exception");
            }

            try
            {
                await specification.CreateMiddlewareAndInvokeHandling(_requestDelegate, _volatileResourceManager);
            }
            catch (NotSupportedException) {}
        }
示例#4
0
        public async Task Context()
        {
            _serviceProvider = new ServiceProviderHelper().BuildServiceProvider();
            DomainEvents.Initialize(_serviceProvider.GetService <IDomainEventHandlerFactory>());

            _serviceScope = _serviceProvider.CreateScope();

            _unitOfWork = _serviceProvider.GetService <NhibernateUnitOfWork>();
            _unitOfWork.BeginTransaction();

            _shipCountBefore = _GetShipCount();

            var manageShipsController = new ManageShipsControllerBuilder(_serviceProvider).Build();

            var createNewShipCommand = new CreateNewShipCommand
            {
                ShipName  = "ship name",
                Tonnage   = 23.4m,
                ImoNumber = "IMO 12345"
            };

            _actionResult = await manageShipsController.CreateNewShip(createNewShipCommand);

            _unitOfWork.Flush();
            _unitOfWork.Clear();
        }
        public void Context()
        {
            HttpContext.Current = FakeHttpContextHelper.GetFakeHttpContext();

            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (TestDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory, isDelayedDomainEventHandlingEnabled: true);
            DomainEvents.ResetDelayedEventsStorage();

            var unitOfWorkFactory = IoC.Resolve <IUnitOfWorkFactory>();

            UnitOfWorkHttpModule.Initialize(unitOfWorkFactory);
            var unitOfWorkHttpModule = new UnitOfWorkHttpModule();
            var httpApplication      = new FakeHttpApplication();

            unitOfWorkHttpModule.Init(httpApplication);

            httpApplication.FireBeginRequest();

            try
            {
                _simulateApplicationTransactionWhichThrowsAnException();
            }
            catch
            {
                httpApplication.FireError();
            }
        }
示例#6
0
        public void Context()
        {
            DomainEvents.Initialize(A.Fake <IDomainEventHandlerFactory>());

            var createNewShipCommand = new CreateNewShipCommand
            {
                ShipName  = "ship name",
                Tonnage   = 23.45678m,
                ImoNumber = "IMO 12345"
            };

            _shipRepository = A.Fake <IRepository <Ship> >();

            A.CallTo(() => _shipRepository.SaveAsync(A <Ship> ._)).Invokes(x =>
            {
                // when shipRepository.Save() is called, simulate NHibernate assigning Id to the Ship entity
                var shipPassedAsParameter = x.GetArgument <Ship>(0);
                shipPassedAsParameter.SetPrivateProperty("Id", 23);
            });
            var createNewShipCommandHandler = new CreateNewShipCommandHandler(_shipRepository);

            createNewShipCommandHandler.CommandExecuted += args => _createdShipId = (int)args.Args;

            createNewShipCommandHandler.ExecuteAsync(createNewShipCommand).Wait();
        }
示例#7
0
        public async Task Context()
        {
            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = domainEvent as IDomainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory);

            _unitOfWork = new NhibernateUnitOfWork(new CoreDddSharedNhibernateConfigurator());
            _unitOfWork.BeginTransaction();

            var createNewShipCommand = new CreateNewShipCommand
            {
                ShipName  = "ship name",
                Tonnage   = 23.45678m,
                ImoNumber = "IMO 12345"
            };
            var createNewShipCommandHandler = new CreateNewShipCommandHandler(new NhibernateRepository <Ship>(_unitOfWork));

            createNewShipCommandHandler.CommandExecuted += args => _createdShipId = (int)args.Args;
            await createNewShipCommandHandler.ExecuteAsync(createNewShipCommand);

            _unitOfWork.Flush();
            _unitOfWork.Clear();

            _persistedShip = _unitOfWork.Get <Ship>(_createdShipId);
        }
        public void Context()
        {
            var domainEventHandlerFactory = IoC.Resolve <IDomainEventHandlerFactory>();

            DomainEvents.Initialize(domainEventHandlerFactory, isDelayedDomainEventHandlingEnabled: true);

            DomainEvents.ResetDelayedEventsStorage();
        }
示例#9
0
        public static void Initialize(TestContext context)
        {
            _container = new WindsorContainer();
            DomainEvents.Initialize(_container);

            _placedEventHandlerMock    = new Mock <IHandle <OrderPlacedEvent> >();
            _cancelledEventHandlerMock = new Mock <IHandle <OrderCancelledEvent> >();
            _container.Register(Component.For <IHandle <OrderPlacedEvent> >().Instance(_placedEventHandlerMock.Object));
            _container.Register(Component.For <IHandle <OrderCancelledEvent> >().Instance(_cancelledEventHandlerMock.Object));
        }
示例#10
0
        private void _InitializeDomainEvents(WindsorContainer ioCContainer, bool isDelayedDomainEventHandlingEnabled)
        {
            var domainEventHandlerFactory = ioCContainer.Resolve <IDomainEventHandlerFactory>();

            DomainEvents.Initialize(domainEventHandlerFactory, isDelayedDomainEventHandlingEnabled: isDelayedDomainEventHandlingEnabled);

            if (isDelayedDomainEventHandlingEnabled)
            {
                DomainEvents.ResetDelayedEventsStorage();
            }
        }
示例#11
0
        private void _RegisterServicesIntoCastleWindsorIoCContainer()
        {
            _castleWindsorIoCContainer = new WindsorContainer();

            CoreDddNhibernateInstaller.SetUnitOfWorkLifeStyle(x => x.PerWebRequest);

            _castleWindsorIoCContainer.Install(
                FromAssembly.Containing <CoreDddInstaller>(),
                FromAssembly.Containing <CoreDddNhibernateInstaller>()
                );
            _castleWindsorIoCContainer.Register(
                Component
                .For <INhibernateConfigurator>()
                .ImplementedBy <CoreDddSampleNhibernateConfigurator>()
                .LifestyleSingleton()
                );

            // register command handlers
            _castleWindsorIoCContainer.Register(
                Classes
                .FromAssemblyContaining <CreateNewShipCommandHandler>()
                .BasedOn(typeof(ICommandHandler <>))
                .WithService.FirstInterface()
                .Configure(x => x.LifestyleTransient())
                );
            // register query handlers
            _castleWindsorIoCContainer.Register(
                Classes
                .FromAssemblyContaining <GetShipsByNameQueryHandler>()
                .BasedOn(typeof(IQueryHandler <>))
                .WithService.FirstInterface()
                .Configure(x => x.LifestyleTransient())
                );
            // register domain event handlers
            _castleWindsorIoCContainer.Register(
                Classes
                .FromAssemblyContaining <ShipUpdatedDomainEventHandler>()
                .BasedOn(typeof(IDomainEventHandler <>))
                .WithService.FirstInterface()
                .Configure(x => x.LifestyleTransient())
                );

            UnitOfWorkHttpModule.Initialize(
                _castleWindsorIoCContainer.Resolve <IUnitOfWorkFactory>(),
                isolationLevel: System.Data.IsolationLevel.ReadCommitted
                );

            DomainEvents.Initialize(
                _castleWindsorIoCContainer.Resolve <IDomainEventHandlerFactory>(),
                isDelayedDomainEventHandlingEnabled: true
                );

            IoC.Initialize(new CastleContainer(_castleWindsorIoCContainer));
        }
示例#12
0
        private void _RegisterServicesIntoNinjectIoCContainer()
        {
            var ninjectIoCContainer = NinjectWebCommon.Bootstrapper.Kernel;

            CoreDddNhibernateBindings.SetUnitOfWorkLifeStyle(x => x.InRequestScope());

            ninjectIoCContainer.Load(
                typeof(CoreDddBindings).Assembly,
                typeof(CoreDddNhibernateBindings).Assembly
                );
            ninjectIoCContainer
            .Bind <INhibernateConfigurator>()
            .To <CoreDddSampleNhibernateConfigurator>()
            .InSingletonScope();

            // register controllers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <HomeController>()
                                     .SelectAllClasses()
                                     .InheritedFrom <ControllerBase>()
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));
            // register command handlers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <CreateNewShipCommandHandler>()
                                     .SelectAllClasses()
                                     .InheritedFrom(typeof(ICommandHandler <>))
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));
            // register query handlers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <GetShipsByNameQueryHandler>()
                                     .SelectAllClasses()
                                     .InheritedFrom(typeof(IQueryHandler <>))
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));
            // register domain event handlers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <ShipUpdatedDomainEventHandler>()
                                     .SelectAllClasses()
                                     .InheritedFrom(typeof(IDomainEventHandler <>))
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));

            UnitOfWorkHttpModule.Initialize(
                ninjectIoCContainer.Get <IUnitOfWorkFactory>(),
                isolationLevel: System.Data.IsolationLevel.ReadCommitted
                );

            DomainEvents.Initialize(
                ninjectIoCContainer.Get <IDomainEventHandlerFactory>(),
                isDelayedDomainEventHandlingEnabled: true
                );
        }
        public void Context()
        {
            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (TestDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory);

            _entity = new TestEntityWithDomainEvent();


            _entity.BehaviouralMethodWithRaisingDomainEvent();
        }
示例#14
0
        public static void Initialize(TestContext context)
        {
            _container = new WindsorContainer();
            DomainEvents.Initialize(_container);

            _addedEventHandlerMock   = new Mock <IHandle <CartLineItemAddedEvent> >();
            _updatedEventHandlerMock = new Mock <IHandle <CartLineItemUpdatedEvent> >();
            _deletedEventHandlerMock = new Mock <IHandle <CartLineItemDeletedEvent> >();
            _container.Register(Component.For <IHandle <CartLineItemAddedEvent> >().Instance(_addedEventHandlerMock.Object));
            _container.Register(Component.For <IHandle <CartLineItemUpdatedEvent> >().Instance(_updatedEventHandlerMock.Object));
            _container.Register(Component.For <IHandle <CartLineItemDeletedEvent> >().Instance(_deletedEventHandlerMock.Object));
        }
        public void raising_domain_event_throws_not_initialized()
        {
            _simulateDomainEventsNotInitialized();

            var ex = Should.Throw <InvalidOperationException>(() => new TestEntityWithDomainEvent().BehaviouralMethodWithRaisingDomainEvent());

            ex.Message.ToLower().ShouldContain("DomainEvents.Initialize");

            void _simulateDomainEventsNotInitialized()
            {
                DomainEvents.Initialize(domainEventHandlerFactory: null);
            }
        }
示例#16
0
        public void Context()
        {
            _raisedDomainEvent = null;

            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (TestDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory, isDelayedDomainEventHandlingEnabled: true);
            DomainEvents.ResetDelayedEventsStorage();

            _entity = new TestEntityWithDomainEvent();


            _entity.BehaviouralMethodWithRaisingDomainEvent();
        }
示例#17
0
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            _container = IoCConfig.Configure();

            LoggingConfig.Configure(Server);

            MappingConfig.Configure();

            DomainEvents.Initialize(_container);

            EagerMigration();

            RunTasksOnStartup();
        }
示例#18
0
        public void Context()
        {
            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (TestDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory);
            DomainEvents.ResetDelayedEventsStorage();

            var unitOfWorkFactory = IoC.Resolve <IUnitOfWorkFactory>();

            RebusUnitOfWork.Initialize(
                unitOfWorkFactory: unitOfWorkFactory,
                isolationLevel: IsolationLevel.ReadCommitted
                );
            _fakeMessageContext = new FakeMessageContext();
            _unitOfWork         = RebusUnitOfWork.Create(_fakeMessageContext);

            _simulateApplicationTransaction();

            RebusUnitOfWork.Commit(_fakeMessageContext, _unitOfWork);
            RebusUnitOfWork.Cleanup(_fakeMessageContext, _unitOfWork);
        }
示例#19
0
        public async Task Context()
        {
            var specification = new TUnitOfWorkMiddlewareSpecification();

            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (TestDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory, isDelayedDomainEventHandlingEnabled: true);
            DomainEvents.ResetDelayedEventsStorage();

            async Task _requestDelegate(HttpContext context)
            {
                _entityRepository = IoC.Resolve <IRepository <TestEntityWithDomainEvent> >();

                _entity = new TestEntityWithDomainEvent();
                _entity.BehaviouralMethodWithRaisingDomainEvent();

                await _entityRepository.SaveAsync(_entity);
            }

            await specification.CreateMiddlewareAndInvokeHandling(_requestDelegate);
        }
示例#20
0
        public void Context()
        {
            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (EmailEnqueuedToBeSentDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory);

            var template = EmailTemplateBuilder.New.Build();

            _email = new EmailBuilder()
                     .WithEmailTemplate(template)
                     .WithId(EmailId)
                     .Build();
            _recipientOne = new Recipient(ToAddressOne, NameOne);
            _recipientTwo = new Recipient(ToAddressTwo, NameTwo);
            _email.EnqueueEmailToBeSent(FromAddress,
                                        new HashSet <Recipient>
            {
                _recipientOne,
                _recipientTwo
            },
                                        Subject);
        }
示例#21
0
        public async Task Context()
        {
            _serviceProvider = new ServiceProviderHelper().BuildServiceProvider();
            DomainEvents.Initialize(_serviceProvider.GetService <IDomainEventHandlerFactory>());

            _unitOfWork = _serviceProvider.GetService <NhibernateUnitOfWork>();
            _unitOfWork.BeginTransaction();

            var createNewShipCommand = new CreateNewShipCommand
            {
                ShipName  = "ship name",
                Tonnage   = 23.45678m,
                ImoNumber = "IMO 12345"
            };

            _bus = A.Fake <IBus>();
            var createNewShipCommandMessageHandler = new CreateNewShipCommandMessageHandler(_serviceProvider.GetService <ICommandExecutor>(), _bus);

            await createNewShipCommandMessageHandler.Handle(createNewShipCommand);

            _unitOfWork.Flush();
            _unitOfWork.Clear();
        }
        public async Task Context()
        {
            var specification = new TUnitOfWorkMiddlewareSpecification();

            var domainEventHandlerFactory = new FakeDomainEventHandlerFactory(domainEvent => _raisedDomainEvent = (TestDomainEvent)domainEvent);

            DomainEvents.Initialize(domainEventHandlerFactory, isDelayedDomainEventHandlingEnabled: true);
            DomainEvents.ResetDelayedEventsStorage();

            async Task _requestDelegate(HttpContext context)
            {
                _entityRepository = IoC.Resolve <IRepository <TestEntityWithDomainEvent> >();
                _entity           = new TestEntityWithDomainEvent();
                await _entityRepository.SaveAsync(_entity);

                throw new NotSupportedException("test exception");
            }

            try
            {
                await specification.CreateMiddlewareAndInvokeHandling(_requestDelegate);
            }
            catch (NotSupportedException) {}
        }
示例#23
0
        private void _RegisterServicesIntoCastleWindsorIoCContainer()
        {
            _castleWindsorIoCContainer = new WindsorContainer();

            CoreDddNhibernateInstaller.SetUnitOfWorkLifeStyle(x => x.PerWebRequest);

            _castleWindsorIoCContainer.Install(
                FromAssembly.Containing <CoreDddInstaller>(),
                FromAssembly.Containing <CoreDddNhibernateInstaller>()
                );
            _castleWindsorIoCContainer.Register(
                Component
                .For <INhibernateConfigurator>()
                .ImplementedBy <CoreDddSampleNhibernateConfigurator>()
                .LifestyleSingleton()
                );

            // register MVC controllers
            _castleWindsorIoCContainer.Register(
                Classes
                .FromAssemblyContaining <HomeController>()
                .BasedOn <ControllerBase>()
                .Configure(x => x.LifestyleTransient())
                );

            // register Web API controllers
            _castleWindsorIoCContainer.Register(
                Classes
                .FromAssemblyContaining <ShipController>()
                .BasedOn <ApiController>()
                .Configure(x => x.LifestyleTransient())
                );

            // register command handlers
            _castleWindsorIoCContainer.Register(
                Classes
                .FromAssemblyContaining <CreateNewShipCommandHandler>()
                .BasedOn(typeof(ICommandHandler <>))
                .WithService.FirstInterface()
                .Configure(x => x.LifestyleTransient())
                );
            // register query handlers
            _castleWindsorIoCContainer.Register(
                Classes
                .FromAssemblyContaining <GetShipsByNameQueryHandler>()
                .BasedOn(typeof(IQueryHandler <>))
                .WithService.FirstInterface()
                .Configure(x => x.LifestyleTransient())
                );
            // register domain event handlers
            _castleWindsorIoCContainer.Register(
                Classes
                .FromAssemblyContaining <ShipUpdatedDomainEventHandler>()
                .BasedOn(typeof(IDomainEventHandler <>))
                .WithService.FirstInterface()
                .Configure(x => x.LifestyleTransient())
                );

            Action <TransactionScope> transactionScopeEnlistmentAction = transactionScope =>
            {
                // enlist custom resource manager into the transaction scope
            };

            TransactionScopeUnitOfWorkHttpModule.Initialize(
                _castleWindsorIoCContainer.Resolve <IUnitOfWorkFactory>(),
                transactionScopeEnlistmentAction: transactionScopeEnlistmentAction,
                isolationLevel: System.Transactions.IsolationLevel.ReadCommitted
                );

            DomainEvents.Initialize(_castleWindsorIoCContainer.Resolve <IDomainEventHandlerFactory>());

            GlobalConfiguration.Configuration.DependencyResolver = new IoCContainerCastleWindsorDependencyResolver(_castleWindsorIoCContainer);
            ControllerBuilder.Current.SetControllerFactory(new IoCContainerCastleWindsorControllerFactory(_castleWindsorIoCContainer));
        }
示例#24
0
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            _windsorContainer = new WindsorContainer();
            _configureBus(_windsorContainer);

            CoreDddNhibernateInstaller.SetUnitOfWorkLifeStyle(x => x.PerWebRequest);

            _windsorContainer.Install(
                FromAssembly.Containing <CoreDddInstaller>(),
                FromAssembly.Containing <CoreDddNhibernateInstaller>(),
                FromAssembly.Containing <ControllerInstaller>(),
                FromAssembly.Containing <CommandHandlerInstaller>(),
                FromAssembly.Containing <EventHandlerInstaller>(),
                FromAssembly.Containing <QueryHandlerInstaller>(),
                FromAssembly.Containing <EmailMakerNhibernateInstaller>()
                );

            _setupTransactionScopeUnitOfWork();
            //_setupDelayedDomainEventHandlingForUnitOfWork();

            ControllerBuilder.Current.SetControllerFactory(new IoCControllerFactory(_windsorContainer));
            ModelBinders.Binders.DefaultBinder = new EnumConverterModelBinder();

            _UpgradeDatabase();

            void _setupTransactionScopeUnitOfWork()
            {
                // call this method only when TransactionScopeUnitOfWorkHttpModule is used instead of UnitOfWorkHttpModule (see web.config system.webServer -> modules)

                TransactionScopeUnitOfWorkHttpModule.Initialize(
                    _windsorContainer.Resolve <IUnitOfWorkFactory>(),
                    transactionScopeEnlistmentAction: transactionScope => transactionScope.EnlistRebus()
                    );

                DomainEvents.Initialize(_windsorContainer.Resolve <IDomainEventHandlerFactory>());
            }

            void _setupDelayedDomainEventHandlingForUnitOfWork()
            {
                // call this method only when UnitOfWorkHttpModule is used instead of TransactionScopeUnitOfWorkHttpModule (see web.config system.webServer -> modules)

                UnitOfWorkHttpModule.Initialize(_windsorContainer.Resolve <IUnitOfWorkFactory>());

                DomainEvents.Initialize(
                    _windsorContainer.Resolve <IDomainEventHandlerFactory>(),
                    isDelayedDomainEventHandlingEnabled: true
                    );
            }

            void _configureBus(WindsorContainer container)
            {
                var rebusConfigurer = Configure.With(new CastleWindsorContainerAdapter(container));

                var rebusInputQueueName = ConfigurationManager.AppSettings["RebusInputQueueName"];
                var rebusTransport      = ConfigurationManager.AppSettings["RebusTransport"];

                switch (rebusTransport)
                {
                case "MSMQ":
                    rebusConfigurer
                    .Transport(x => x.UseMsmq(rebusInputQueueName))
                    .Subscriptions(x => x.UseJsonFile($"{Path.GetTempPath()}\\emailmaker_msmq_subscriptions.json"))
                    ;
                    break;

                case "RabbitMQ":
                    var rebusRabbitMqConnectionString = ConfigurationManager.AppSettings["RebusRabbitMqConnectionString"];
                    rebusConfigurer.Transport(x => x.UseRabbitMq(rebusRabbitMqConnectionString, rebusInputQueueName));
                    break;

                default:
                    throw new Exception($"Unknown rebus transport: {rebusTransport}");
                }

                rebusConfigurer.Start();
            }
        }
示例#25
0
        static void Main(string[] args)
        {
            using (var windsorContainer = new WindsorContainer())
            {
                CoreDddNhibernateInstaller.SetUnitOfWorkLifeStyle(x => x.PerRebusMessage());

                windsorContainer.Install(
                    FromAssembly.Containing <CoreDddInstaller>(),
                    FromAssembly.Containing <CoreDddNhibernateInstaller>()
                    );

                windsorContainer.Register(
                    Component.For <INhibernateConfigurator>()
                    .ImplementedBy <CoreDddSharedNhibernateConfigurator>()
                    .LifeStyle.Singleton
                    );

                windsorContainer.Register(
                    Component.For <IInternationalMaritimeOrganizationVerifier>()
                    .ImplementedBy <InternationalMaritimeOrganizationVerifier>()
                    .LifeStyle.Transient
                    );

                // register command handlers
                windsorContainer.Register(
                    Classes
                    .FromAssemblyContaining <CreateNewShipCommandHandler>()
                    .BasedOn(typeof(ICommandHandler <>))
                    .WithService.FirstInterface()
                    .Configure(x => x.LifestyleTransient()));

                // register domain event handlers
                windsorContainer.Register(
                    Classes
                    .FromAssemblyContaining <ShipCreatedDomainEventHandler>()
                    .BasedOn(typeof(IDomainEventHandler <>))
                    .WithService.FirstInterface()
                    .Configure(x => x.LifestyleTransient()));

                windsorContainer.AutoRegisterHandlersFromAssemblyOf <VerifyImoNumberShipCreatedDomainEventMessageHandler>();

                DomainEvents.Initialize(windsorContainer.Resolve <IDomainEventHandlerFactory>());

                RebusUnitOfWork.Initialize(
                    unitOfWorkFactory: windsorContainer.Resolve <IUnitOfWorkFactory>(),
                    isolationLevel: System.Data.IsolationLevel.ReadCommitted
                    );

                var rebusConfigurer = Configure.With(new CastleWindsorContainerAdapter(windsorContainer))
                                      .Transport(x => x.UseRabbitMq("amqp://*****:*****@localhost", "ServiceApp"))
                                      .Options(o =>
                {
                    o.EnableUnitOfWork(
                        RebusUnitOfWork.Create,
                        RebusUnitOfWork.Commit,
                        RebusUnitOfWork.Rollback,
                        RebusUnitOfWork.Cleanup
                        );
                });
                using (var bus = rebusConfigurer.Start())
                {
                    bus.Subscribe <ShipCreatedDomainEventMessage>().Wait();

                    Console.WriteLine("Press enter to quit");
                    Console.ReadLine();
                }
            }
        }
示例#26
0
        public static void _RegisterServicesIntoNinjectIoCContainer()
        {
            var ninjectIoCContainer = NinjectWebCommon.Bootstrapper.Kernel;

            CoreDddNhibernateBindings.SetUnitOfWorkLifeStyle(x => x.InRequestScope());

            ninjectIoCContainer.Load(
                typeof(CoreDddBindings).Assembly,
                typeof(CoreDddNhibernateBindings).Assembly
                );
            ninjectIoCContainer
            .Bind <INhibernateConfigurator>()
            .To <CoreDddSampleNhibernateConfigurator>()
            .InSingletonScope();

            // register MVC controllers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <HomeController>()
                                     .SelectAllClasses()
                                     .InheritedFrom <ControllerBase>()
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));

            // register Web API controllers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <ShipController>()
                                     .SelectAllClasses()
                                     .InheritedFrom <ApiController>()
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));

            // register command handlers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <CreateNewShipCommandHandler>()
                                     .SelectAllClasses()
                                     .InheritedFrom(typeof(ICommandHandler <>))
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));

            // register query handlers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <GetShipsByNameQueryHandler>()
                                     .SelectAllClasses()
                                     .InheritedFrom(typeof(IQueryHandler <>))
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));

            // register domain event handlers
            ninjectIoCContainer.Bind(x => x
                                     .FromAssemblyContaining <ShipUpdatedDomainEventHandler>()
                                     .SelectAllClasses()
                                     .InheritedFrom(typeof(IDomainEventHandler <>))
                                     .BindAllInterfaces()
                                     .Configure(y => y.InTransientScope()));

            Action <TransactionScope> transactionScopeEnlistmentAction = transactionScope =>
            {
                // enlist custom resource manager into the transaction scope
            };

            TransactionScopeUnitOfWorkHttpModule.Initialize(
                ninjectIoCContainer.Get <IUnitOfWorkFactory>(),
                transactionScopeEnlistmentAction: transactionScopeEnlistmentAction,
                isolationLevel: System.Transactions.IsolationLevel.ReadCommitted
                );

            DomainEvents.Initialize(ninjectIoCContainer.Get <IDomainEventHandlerFactory>());
        }
示例#27
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            var applicationLifetime = app.ApplicationServices.GetRequiredService <IApplicationLifetime>();

            applicationLifetime.ApplicationStopping.Register(OnShutdown);

            _windsorContainer.GetFacility <AspNetCoreFacility>().RegistersMiddlewareInto(app);

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error/Error");
            }

            var unitOfWorkMode = AppSettings.Configuration["UnitOfWorkMode"];

            switch (unitOfWorkMode)
            {
            case "TransactionScopeUnitOfWork":
                _setupTransactionScopeUnitOfWork();
                break;

            case "UnitOfWork":
                _setupUnitOfWorkWithDelayedDomainEventHandling();
                break;

            default:
                throw new NotSupportedException("Unsupported unit of work mode.");
            }

            var pathBase = AppSettings.Configuration["PathBase"];

            if (!string.IsNullOrWhiteSpace(pathBase))
            {
                app.UsePathBase(pathBase);
            }

            app.UseStaticFiles();

            app.UseAuthentication();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

            _ConfigureBus(_windsorContainer);
            _UpgradeDatabase();

            void _setupTransactionScopeUnitOfWork()
            {
                _windsorContainer.Register(
                    Component.For <TransactionScopeUnitOfWorkMiddleware>()
                    .DependsOn(Dependency.OnValue <System.Transactions.IsolationLevel>(
                                   System.Transactions.IsolationLevel.ReadCommitted
                                   ))
                    .DependsOn(Dependency.OnValue <Action <System.Transactions.TransactionScope> >(
                                   (Action <System.Transactions.TransactionScope>)(transactionScope => transactionScope.EnlistRebus())
                                   ))
                    .LifestyleSingleton().AsMiddleware()
                    );

                DomainEvents.Initialize(_windsorContainer.Resolve <IDomainEventHandlerFactory>());
            }

            void _setupUnitOfWorkWithDelayedDomainEventHandling()
            {
                _windsorContainer.Register(
                    Component.For <UnitOfWorkMiddleware>()
                    .DependsOn(Dependency.OnValue <IsolationLevel>(IsolationLevel.ReadCommitted))
                    .LifestyleSingleton().AsMiddleware()
                    );

                DomainEvents.Initialize(
                    _windsorContainer.Resolve <IDomainEventHandlerFactory>(),
                    isDelayedDomainEventHandlingEnabled: true
                    );
            }
        }
示例#28
0
 public static void RegisterHandlers(IServiceContainer container)
 {
     _store = new DomainEventHandlersStore();
     RegisterAllEvents(container);
     DomainEvents.Initialize(_store);
 }