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