private static void ResolveForSqlServerCe(IUnityContainer container, string microserviceName, string connectionString, bool persistIncomingPayloads, Func <string, ITextSerializer, string, bool> consumerFilter) { Func <bool, EventStoreCeDbContext> storeContextFactory = isReadOnly => new EventStoreCeDbContext(isReadOnly, connectionString); Func <bool, EventQueueCeDbContext> queueContextFactory = isReadOnly => new EventQueueCeDbContext(isReadOnly, connectionString); var serializer = container.Resolve <ITextSerializer>(); var time = container.Resolve <IUtcTimeProvider>(); var eventStore = new OrmEventStore <TStream>(microserviceName, serializer, storeContextFactory, time, container.Resolve <IGuidProvider>(), container.Resolve <ILogger>(), persistIncomingPayloads, consumerFilter); container.RegisterInstance <IEventStore <TStream> >(eventStore); container.RegisterInstance <ISubscriptionRepository>(eventStore); }
public static Func <IMicroservice> CreateDenormalizer <TDbContext>( string uniqueName, IEventStoreConfig eventStoreConfig = null, IPollerConfig pollerConfig = null, bool persistIncomingPayloads = true, Func <IBus, ILogger, IEventStore <TStream>, THandler> processorFactory = null) where TDbContext : DbContext, IEventStoreDbContext { return(() => { var streamFullName = EnsureStreamCategoryNameIsValid(uniqueName); var container = EventSystem.ResolveNewChildContainerAndRegisterInMemorySubscriptions(streamFullName); System.Data.Entity.Database.SetInitializer <TDbContext>(null); pollerConfig = ConfigResolver.ResolveConfig(pollerConfig); eventStoreConfig = ConfigResolver.ResolveConfig(eventStoreConfig); var connectionString = eventStoreConfig.ConnectionString; AuthorizationFactory.SetToken(eventStoreConfig); Func <bool, EventStoreDbContext> storeContextFactory = isReadOnly => new EventStoreDbContext(isReadOnly, connectionString); Func <bool, EventQueueDbContext> queueContextFactory = isReadOnly => new EventQueueDbContext(isReadOnly, connectionString); var log = container.Resolve <ILogger>(); var serializer = container.Resolve <ITextSerializer>(); var time = container.Resolve <IUtcTimeProvider>(); var guid = container.Resolve <IGuidProvider>(); // Do not know why an EventStore will need a denormalizer... and a Publisher! // The only events that can (and sould) be queries is 'ReadModelUpdated'. var dbContextConstructor = typeof(TDbContext).GetConstructor(new[] { typeof(bool), typeof(string) }); Ensure.CastIsValid(dbContextConstructor, "Type TDbContext must have a constructor with the following signature: ctor(bool, string)"); Func <bool, IEventStoreDbContext> dbContextFactory = isReadOnly => (TDbContext)dbContextConstructor.Invoke(new object[] { isReadOnly, connectionString }); var eventStore = new OrmEventStore <TStream>(streamFullName, serializer, dbContextFactory, time, guid, log, persistIncomingPayloads, null); container.RegisterInstance <IEventStore <TStream> >(eventStore); var bus = new Bus(); container.RegisterInstance <IBus>(bus); var receiver = new LongPoller(bus, log, TimeSpan.FromMilliseconds(pollerConfig.Timeout), streamFullName, container.Resolve <IInMemoryEventPublisher>()); var poller = new Poller(bus, log, container.Resolve <IInMemoryEventPublisher>(), eventStore, receiver, serializer, pollerConfig.BufferQueueMaxCount, pollerConfig.EventsToFlushMaxCount); container.RegisterInstance <IMonitoredSubscriber>(poller); var publisher = new Publisher(streamFullName, eventStore, bus, log, eventStoreConfig.PushMaxCount, TimeSpan.FromMilliseconds(eventStoreConfig.LongPollingTimeout)); container.RegisterInstance <IPollableEventSource>(publisher); var fsm = new MicroserviceHost(streamFullName, bus, log, true); container.RegisterInstance <IMicroservice>(fsm); if (processorFactory == null) { var processorConstructor = typeof(THandler).GetConstructor(new[] { typeof(IBus), typeof(ILogger), typeof(IEventStore <TStream>) }); Ensure.CastIsValid(processorConstructor, "Type THandler must have a valid constructor with the following signature: .ctor(IBus, ILogger, IEventStore<T>)"); var processor = (THandler)processorConstructor.Invoke(new object[] { bus, log, eventStore }); } else { var processor = processorFactory.Invoke(bus, log, eventStore); } //var heartbeatEmitter = new HeartbeatEmitter(fsm, log, poller); var heartbeatEmitter = new HeartbeatEmitter(streamFullName); return fsm; }); }