Esempio n. 1
0
        private void _RegisterComponents(WindsorContainer ioCContainer)
        {
            CoreDddNhibernateInstaller.SetUnitOfWorkLifeStyle(x => x.PerThread);

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

            ioCContainer.Register(
                Classes
                .FromAssemblyContaining <CreateNewShipCommand>()    // register all command handlers in this assembly
                .BasedOn(typeof(ICommandHandler <>))
                .WithService.FirstInterface()
                .Configure(x => x.LifestyleTransient()),
                Classes
                .FromAssemblyContaining <GetPoliciesByTermsQuery>()    // register all query handlers in this assembly
                .BasedOn(typeof(IQueryHandler <>))
                .WithService.FirstInterface()
                .Configure(x => x.LifestyleTransient()),
                Component.For <INhibernateConfigurator>() // register nhibernate configurator
                .ImplementedBy <CoreDddSampleNhibernateConfigurator>()
                .LifeStyle.Singleton,
                Component.For <ShipController>(),         // register ship controller to get query executor and command executor injected into the constructor
                Component.For <PolicyHolderController>(), // register policy holder controller to get query executor and command executor injected into the constructor
                Component.For <PolicyController>()        // register policy controller to get query executor and command executor injected into the constructor
                );
        }
Esempio n. 2
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));
        }
Esempio n. 3
0
        private void _RegisterApplicationComponents()
        {
            CoreDddNhibernateInstaller.SetUnitOfWorkLifeStyle(x => x.Scoped());

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

            IoC.Initialize(new CastleContainer(_windsorContainer));
        }
Esempio n. 4
0
        public static IWindsorContainer RegisterServicesIntoIoC()
        {
            var windsorContainer = new WindsorContainer();

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

            windsorContainer.Install(
                FromAssembly.Containing <CoreDddInstaller>(),
                FromAssembly.Containing <CoreDddNhibernateInstaller>(),
                FromAssembly.Containing <EmailSenderInstaller>(),
                FromAssembly.Containing <QueryHandlerInstaller>(),
                FromAssembly.Containing <EmailMakerNhibernateInstaller>()
                );
            IoC.Initialize(new CastleContainer(windsorContainer));
            return(windsorContainer);
        }
Esempio n. 5
0
        public void SetUp()
        {
            _acquireSynchronizationMutex();

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

            _windsorContainer = new WindsorContainer();
            _windsorContainer.Install(
                FromAssembly.Containing <CoreDddNhibernateInstaller>(),
                FromAssembly.Containing <EmailMakerNhibernateInstaller>()
                );
            IoC.Initialize(new CastleContainer(_windsorContainer));

            _buildDatabase();

            void _acquireSynchronizationMutex()
            {
                var mutexName = GetType().Namespace;

                _mutex = new Mutex(false, mutexName);
                if (!_mutex.WaitOne(TimeSpan.FromSeconds(60)))
                {
                    throw new Exception(
                              "Timeout waiting for synchronization mutex to prevent other .net frameworks running concurrent tests over the same database");
                }
            }

            void _buildDatabase()
            {
                var configuration = IoC.Resolve <INhibernateConfigurator>().GetConfiguration();

                var connectionString      = configuration.Properties["connection.connection_string"];
                var connectionDriverClass = configuration.Properties["connection.driver_class"];
                var dbProviderName        = _GetDbProviderName(connectionDriverClass);

                var assemblyLocation   = _GetAssemblyLocation();
                var folderWithSqlFiles = Path.Combine(assemblyLocation, "EmailMaker.Database", dbProviderName);

                var builderOfDatabase = new BuilderOfDatabase(createConnectionFunc: _createDbConnection);

                builderOfDatabase.BuildDatabase(folderWithSqlFiles);

                IDbConnection _createDbConnection()
                {
                    switch (dbProviderName)
                    {
                    case string x when x.Contains("sqlite"):
                        return(new SQLiteConnection(connectionString));

                    case string x when x.Contains("sqlserver"):
                        return(new SqlConnection(connectionString));

                    case string x when x.Contains("postgresql"):
                        return(new NpgsqlConnection(connectionString));

                    default:
                        throw new Exception("Unsupported NHibernate connection.driver_class");
                    }
                }
            }
        }
Esempio n. 6
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();
                }
            }
        }
Esempio n. 7
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();
            }
        }
Esempio n. 8
0
        public void SetUp()
        {
            _acquireSynchronizationMutex();

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

            _container = new WindsorContainer();

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

            IoC.Initialize(new CastleContainer(_container));

            _createDatabase();

            void _acquireSynchronizationMutex()
            {
                var mutexName = GetType().Namespace;

                _mutex = new Mutex(false, mutexName);
                if (!_mutex.WaitOne(TimeSpan.FromSeconds(60)))
                {
                    throw new Exception(
                              "Timeout waiting for synchronization mutex to prevent other .net frameworks running concurrent tests over the same database");
                }
            }

            void _createDatabase()
            {
                var configuration = IoC.Resolve <INhibernateConfigurator>().GetConfiguration();

                using (var connection = _getDbConnection())
                {
                    connection.Open();
                    new SchemaExport(configuration).Execute(
                        useStdOut: true,
                        execute: true,
                        justDrop: false,
                        connection: connection,
                        exportOutput: Console.Out)
                    ;
                }

                DbConnection _getDbConnection()
                {
                    var connectionString      = configuration.Properties["connection.connection_string"];
                    var connectionDriverClass = configuration.Properties["connection.driver_class"];

                    switch (connectionDriverClass)
                    {
                    case string x when x.Contains("SQLite"):
                        return(new SQLiteConnection(connectionString));

                    case string x when x.Contains("SqlClient"):
                        return(new SqlConnection(connectionString));

                    case string x when x.Contains("NpgsqlDriver"):
                        return(new NpgsqlConnection(connectionString));

                    default:
                        throw new Exception("Unsupported NHibernate connection.driver_class");
                    }
                }
            }
        }
Esempio n. 9
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));
        }