예제 #1
0
 public EventsController(
     UserManager <ApplicationUser> userManager,
     ApplicationDbContext context)
 {
     _userManager  = userManager;
     _eventsReader = new EventsReader(context);
 }
예제 #2
0
 public OutboxPublisher(
     DbConnections connections,
     IReadOnlyDictionary <string, IEventStoreContext> categories,
     EventsReader reader)
 {
     _connections = connections;
     _categories  = categories;
     _reader      = reader;
 }
예제 #3
0
 public EventsOutbox(IEventStoreContext context, EventsReader reader)
 {
     _context = context ?? throw new ArgumentNullException(nameof(context));
     _reader  = reader ?? throw new ArgumentNullException(nameof(reader));
 }
예제 #4
0
        public static IServiceCollection AddEventStore(
            this IServiceCollection services,
            EventStoreSettings settings,
            ILoggerFactory loggerFactory)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }
            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            if (settings.Store == null)
            {
                throw new ArgumentException("Store settings not specified.", nameof(settings.Store));
            }

            if (settings.AggregateFactories == null)
            {
                throw new ArgumentException("Factories not specified.", nameof(settings.AggregateFactories));
            }

            var compositeContext = new CompositeEventStoreContext(settings.Store.Contexts);
            var typesRegistry    = new EventTypeRegistry(settings.Store.Connections, compositeContext);

            InitializeSchemas(settings.Store, typesRegistry);

            var reader = new EventsReader(settings.Store.Connections, compositeContext, typesRegistry);

            var eventStore = new Postgres.EventStore(
                reader,
                new EventsWriter(settings.Store.Connections, compositeContext, typesRegistry,
                                 new EventsOutbox(compositeContext, reader),
                                 loggerFactory.CreateLogger <EventsWriter>())
                );

            var backgroundPublisher = new OutboxPublisherService(
                new OutboxPublisher(
                    settings.Store.Connections,
                    settings.Store.Contexts,
                    reader),
                settings.Store.OutboxInterval,
                loggerFactory.CreateLogger <OutboxPublisherService>());

            services
            .AddAggregates(settings.AggregateFactories)
            .AddStreamResolver(settings.Store.Serializer)
            .AddSingleton <IEventStore>(eventStore)
            .AddSingleton <IHostedService>(backgroundPublisher);

            if (settings.Snapshots == null)
            {
                return(services);
            }

            return(services.AddSnapshotStore(
                       settings.Snapshots,
                       settings.Store.Connections,
                       compositeContext, loggerFactory));
        }