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 ); }
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)); }
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)); }
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); }
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"); } } } }
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(); } } }
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(); } }
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"); } } } }
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)); }