public static async Task StartAsync() { using (await _queue.GetBlockingScope()) { if (_initialized) { throw new InvalidOperationException("Bootstrapper has already been invoked"); } var constantSettings = ApplicationBootstrapper.ConstantSettingsProvider.Find(); var directoryPath = AppDomain.CurrentDomain.BaseDirectory; await WriteDatabaseInitializer.Initialize(new WriteDatabaseConfiguration(directoryPath, constantSettings.DatabaseFilePath, constantSettings.DatabaseEncryptionKey)); await ReadDatabaseInitializer.Initialize(); var applicationSettings = await new ApplicationSettingsRepository(WriteDatabaseInitializer.DatabaseContext).LoadAsync(); var applicationListenerUri = string.Format(constantSettings.ApplicationListenerUri, constantSettings.SystemIpAddress, applicationSettings.ApplicationCommunicationPort); var builder = new ContainerBuilder(); var assemblies = new[] { Assembly.GetEntryAssembly() } .Union(new[] { "iGP11.Library.dll", "iGP11.Library.Component.dll", "iGP11.Library.Component.DataAnnotations.dll", "iGP11.Library.DDD.dll", "iGP11.Library.EventPublisher.dll", "iGP11.Library.File.dll", "iGP11.Library.Hub.dll", "iGP11.Library.Hub.Client.dll", "iGP11.Library.Hub.Shared.dll", "iGP11.Library.Hub.Transport.dll", "iGP11.Library.Network.dll", "iGP11.Library.Scheduler.dll", "iGP11.Tool.Application.dll", "iGP11.Tool.Application.Api.dll", "iGP11.Tool.Domain.dll", "iGP11.Tool.Infrastructure.Communication.dll", "iGP11.Tool.Infrastructure.External.dll", "iGP11.Tool.Infrastructure.Database.dll", "iGP11.Tool.Localization.dll", "iGP11.Tool.ReadModel.dll", "iGP11.Tool.ReadModel.Api.dll", "iGP11.Tool.Shared.dll" } .Select(Assembly.LoadFrom)) .ToArray(); foreach (var assembly in assemblies) { builder.RegisterAssemblyTypes(assembly) .AsSelf() .AsImplementedInterfaces(); } builder.Register( context => { var listener = new NetworkListener($"{applicationListenerUri}/", context.Resolve <ILogger>()); foreach (dynamic handler in assemblies.GetImplementations(typeof(INetworkCommandHandler)).Select(context.Resolve)) { listener.Register(handler); } return(listener); }) .SingleInstance() .AsSelf() .AsImplementedInterfaces(); var proxyCommunicationPort = applicationSettings.ProxyCommunicationPort; var systemIpAddress = constantSettings.SystemIpAddress; var eventPublisher = new EventPublisher(); _scheduler = new BlockingScheduler(eventPublisher.Collect, Interval); _scheduler.Start(); builder.Register(context => Logger.Current).SingleInstance().AsSelf().AsImplementedInterfaces(); builder.Register(context => WriteDatabaseInitializer.DatabaseContext).SingleInstance().AsSelf().AsImplementedInterfaces(); builder.Register(context => ReadDatabaseInitializer.Database).SingleInstance().AsSelf().AsImplementedInterfaces(); builder.Register(context => new CommunicatorFactory(systemIpAddress, proxyCommunicationPort, Logger.Current)).AsSelf().AsImplementedInterfaces(); builder.Register(context => eventPublisher).SingleInstance().AsSelf().AsImplementedInterfaces(); builder.Register(context => constantSettings.Plugins).AsSelf().AsImplementedInterfaces(); builder.Register(context => new NetworkPublisher(applicationListenerUri)).AsSelf().AsImplementedInterfaces(); builder.Register(context => new GameSettingsProcessWatcher( constantSettings.Plugins, systemIpAddress, proxyCommunicationPort, context.Resolve <ComponentAssembler>(), context.Resolve <IDirectoryRepository>(), context.Resolve <IGameRepository>(), context.Resolve <IInjectionService>(), Logger.Current, context.Resolve <IProcessWatcher>())) .SingleInstance() .AsSelf() .AsImplementedInterfaces(); var hubEventRepository = new InMemoryEventRepository <HubEvent>(); var endpointEventRepository = new InMemoryEventRepository <EndpointEvent>(); var transport = new InMemoryTransport(); var eventSerializerFactory = new DataContractEventSerializerFactory(); var hubClientFactory = new HubClientFactory(transport, eventSerializerFactory); _hub = new Hub(hubEventRepository, endpointEventRepository, transport, Logger.Current); var commandEndpointId = EndpointId.Generate(); var queryEndpointId = EndpointId.Generate(); builder.Register(context => new DomainActionBuilder(new ActionBuilder(hubClientFactory, eventSerializerFactory), commandEndpointId)).AsSelf().AsImplementedInterfaces(); DependencyResolver.Current = new AutofacResolver(builder.Build()); var domainCommandHubHost = new DomainCommandHubHost(commandEndpointId, queryEndpointId, hubClientFactory); foreach (dynamic handler in assemblies.GetImplementations(typeof(IDomainCommandHandler <>)).Select(DependencyResolver.Current.Resolve)) { ListenFor(domainCommandHubHost, handler); } var domainEventHubHost = new DomainEventHubHost(queryEndpointId, hubClientFactory); foreach (dynamic handler in assemblies.GetImplementations(typeof(IDomainEventHandler <>)).Select(DependencyResolver.Current.Resolve)) { ListenFor(domainEventHubHost, handler); } domainCommandHubHost.Start(); domainEventHubHost.Start(); _initialized = true; } }
private static void ListenFor <TEvent>(DomainEventHubHost host, IDomainEventHandler <TEvent> handler) { host.ListenFor(handler, new DataContractEventSerializer <Event <TEvent> >()); }