private IUnityContainer CreateContainer(IDomainWorkerRegistry domainRegistry) { var container = new UnityContainer(); container.RegisterInstance <IDomainWorkerRegistry>(domainRegistry); // Infrastructure container.RegisterInstance <ISystemTime>(domainRegistry.Config.SystemTime); container.RegisterInstance <ITextSerializer>(new JsonTextSerializer()); container.RegisterInstance <IMetadataProvider>(new StandardMetadataProvider()); container.RegisterInstance <ITracer>(_tracer); var config = container.Resolve <IDomainWorkerRegistry>().Config; var serializer = container.Resolve <ITextSerializer>(); var metadata = container.Resolve <IMetadataProvider>(); var tracer = container.Resolve <ITracer>(); var dateTime = container.Resolve <ISystemTime>(); var commandBus = new CommandBus( new MessageSender(System.Data.Entity.Database.DefaultConnectionFactory, config.EventStoreConnectionString, config.CommandBusTableName), serializer, dateTime); var eventBus = new EventBus( new MessageSender(System.Data.Entity.Database.DefaultConnectionFactory, config.EventStoreConnectionString, config.EventBusTableName), serializer); var commandProcessor = new CommandProcessor( new MessageReceiver(System.Data.Entity.Database.DefaultConnectionFactory, config.EventStoreConnectionString, config.CommandBusTableName, config.BusPollDelay, config.NumberOfProcessorsThreads, dateTime), serializer, tracer, new CommandBusTransientFaultDetector(config.EventStoreConnectionString)); var liveEventProcessor = new EventProcessor( new MessageReceiver(System.Data.Entity.Database.DefaultConnectionFactory, config.EventStoreConnectionString, config.EventBusTableName, config.BusPollDelay, config.NumberOfProcessorsThreads, dateTime), serializer, tracer, new AsynchronousEventDispatcher(tracer)); container.RegisterInstance <ICommandBus>(commandBus); container.RegisterInstance <IEventBus>(eventBus); container.RegisterInstance <ICommandHandlerRegistry>(commandProcessor); container.RegisterInstance <IMessageProcessor>("CommandProcessor", commandProcessor); container.RegisterInstance <IEventHandlerRegistry>(liveEventProcessor); container.RegisterInstance <IMessageProcessor>("EventProcessor", liveEventProcessor); var indentedSerializer = new JsonTextSerializer(); // Event log database and handler //this.RegisterMessageLogger(container, indentedSerializer, metadata, liveEventProcessor, config.MessageLogConnectionString, tracer, dateTime); // Event Store container.RegisterType <EventStoreDbContext>(new TransientLifetimeManager(), new InjectionConstructor(config.EventStoreConnectionString)); this.RegisterSnapshoter(container); container.RegisterType(typeof(IEventStore <>), typeof(EventStore <>), new ContainerControlledLifetimeManager()); // Bounded Context Registration foreach (var registrationAction in domainRegistry.RegistrationList) { registrationAction(container, liveEventProcessor); } // Handlers this.RegisterCommandHandlers(container); this.RegisterAditionalEventHandlers(container, liveEventProcessor); return(container); }
/// <summary> /// Acepta aparte del dominio un tracer, que puede ser de consola o web, hasta el momento. /// </summary> public WorkerRole(IDomainWorkerRegistry domainRegistry, ITracer tracer) { _tracer = tracer; DbConfiguration.SetConfiguration(new TransientFaultHandlingDbConfiguration()); this.cancellationTokenSource = new CancellationTokenSource(); this.container = this.CreateContainer(domainRegistry); this.processors = this.container.ResolveAll <IMessageProcessor>().ToList(); }