public EventRepository(
     IEventTypeIdentifierProvider eventTypeIdentifierProvider,
     IEventLogger eventLogger,
     IShardCalculator shardCalculator,
     ISerializer serializer)
 {
     this.eventTypeIdentifierProvider = eventTypeIdentifierProvider;
     this.eventLogger     = eventLogger;
     this.shardCalculator = shardCalculator;
     this.serializer      = serializer;
 }
        public IEventRepository CreateEventRepository(IShardCalculator shardCalculator, IEventRepositoryColumnFamilyFullNames columnFamilies, IEventLogProfiler profiler, TimeSpan eventsTtl)
        {
            var eventLogPointerCreator = new EventLogPointerCreator();

            var remoteLockImplementation            = new CassandraRemoteLockImplementation(cassandraCluster, serializer, CassandraRemoteLockImplementationSettings.Default(columnFamilies.RemoteLock.KeyspaceName, columnFamilies.RemoteLock.ColumnFamilyName));
            var remoteLocker                        = new RemoteLocker(remoteLockImplementation, new RemoteLockerMetrics(columnFamilies.RemoteLock.KeyspaceName), logger);
            var eventLoggerAdditionalInfoRepository = new EventLoggerAdditionalInfoRepository(cassandraCluster, serializer, remoteLocker, columnFamilies.EventLogAdditionalInfo, columnFamilies.EventLog);
            var eventStorage                        = new EventStorage(columnFamilies.EventLog, eventLogPointerCreator, cassandraCluster, serializer);
            Func <IQueueRaker> createQueueRaker     = () => new QueueRaker(eventStorage, eventLoggerAdditionalInfoRepository, profiler, logger, eventsTtl);
            var eventLogger = new EventLogger(cassandraCluster, serializer, columnFamilies.EventLog, eventLogPointerCreator, createQueueRaker, eventLoggerAdditionalInfoRepository, profiler, logger);

            return(new EventRepository(eventTypeIdentifierProvider, eventLogger, shardCalculator, serializer));
        }