Пример #1
0
 public static IServiceCollection AddEventTypeResolver(
     this IServiceCollection services,
     Action <EventTypeRegistry> configure)
 {
     services.AddSingleton <IEventTypeResolver>(serviceProvider =>
     {
         var eventTypeRegistry = new EventTypeRegistry();
         configure(eventTypeRegistry);
         return(new MappedEventTypeProvider(eventTypeRegistry));
     });
     return(services);
 }
Пример #2
0
        protected virtual IEventRepository CreateBoxEventRepository(Func <EventId, object, string> calculateShard)
        {
            var serializer        = new Serializer(new AllPropertiesExtractor());
            var cassandraCluster  = new CassandraCluster(cassandraClusterSettings, Logger.Instance);
            var eventTypeRegistry = new EventTypeRegistry();

            var factory = new EventRepositoryFactory(serializer, cassandraCluster, eventTypeRegistry, Logger.Instance);
            var eventRepositoryColumnFamilyFullNames = new EventRepositoryColumnFamilyFullNames(
                ColumnFamilies.eventLog,
                ColumnFamilies.eventLogAdditionalInfo,
                ColumnFamilies.remoteLock);
            var shardCalculator = new ShardCalculator(calculateShard);
            var eventRepository = factory.CreateEventRepository(shardCalculator, eventRepositoryColumnFamilyFullNames, new EventLogNullProfiler(), TimeSpan.FromDays(1));

            return(eventRepository);
        }
Пример #3
0
        private IEventRepository CreateBoxEventRepository(Func <EventId, object, string> calculateShard, double timeoutInSeconds)
        {
            var serializer        = new Serializer(new AllPropertiesExtractor());
            var cassandraSettings = SingleCassandraNodeSetUpFixture.Node.CreateSettings();
            var cassandraCluster  = new CatalogueCassandraClusterWithLongWrites(new CassandraCluster(cassandraSettings, Logger.Instance), TimeSpan.FromSeconds(timeoutInSeconds));
            var eventTypeRegistry = new EventTypeRegistry();

            var factory = new EventRepositoryFactory(serializer, cassandraCluster, eventTypeRegistry, Logger.Instance);
            var eventRepositoryColumnFamilyFullNames = new EventRepositoryColumnFamilyFullNames(
                ColumnFamilies.eventLog,
                ColumnFamilies.eventLogAdditionalInfo,
                ColumnFamilies.remoteLock);
            var shardCalculator = new ShardCalculator(calculateShard);
            var result          = factory.CreateEventRepository(shardCalculator, eventRepositoryColumnFamilyFullNames, new EventLogNullProfiler(), TimeSpan.FromDays(1));

            return(result);
        }
Пример #4
0
        private static void InitializeSchemas(
            StoreSettings settings,
            EventTypeRegistry typesRegistry)
        {
            var schemas = settings.Contexts
                          .SelectMany(c => c.Value.GetSchemas(c.Key))
                          .ToArray();

            using var connection = new NpgsqlConnection(settings.Connections.Default);
            connection.Open();

            var installer = new SchemaInstaller(connection);

            foreach (var schema in schemas)
            {
                installer.Install(schema);
            }

            typesRegistry.Load(connection, schemas);
        }
Пример #5
0
 public static EventTypeRegistry Map <TEvent>(this EventTypeRegistry _this, string eventName)
 {
     return(_this.Map(eventName, typeof(TEvent)));
 }
Пример #6
0
 public MappedEventTypeProvider(EventTypeRegistry eventTypeRegistry)
 {
     this.eventTypeRegistry = eventTypeRegistry;
 }
Пример #7
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));
        }