public static void StartSubscriber(IWebHost host) { using (var scope = host.Services.CreateScope()) { var provider = scope.ServiceProvider; var subscriptionOptions = provider.GetService <IOptions <SubscriberOptions> >(); Microsoft.Extensions.Logging.ILogger <Program> logger = provider.GetService <Microsoft.Extensions.Logging.ILogger <Program> >(); var readSourceName = subscriptionOptions.Value.TopicName; if (string.IsNullOrWhiteSpace(readSourceName)) { throw new Exception("Event store subcriber cannot be started."); } var repository = provider.GetService <IReadModelRepository <ReadPointer> >(); var readPointer = repository.GetAll() .FirstOrDefault(x => x.SourceName == readSourceName); if (readPointer == null) { readPointer = new ReadPointer { SourceName = readSourceName, Position = -1, CreatedOn = DateTime.Now, LastModifiedOn = DateTime.Now, PublicId = Guid.NewGuid() }; Task.Run(() => { try { repository.AddAsync(readPointer); } catch (Exception e) { logger.LogError(e, e.Message); throw; } }).Wait(); } var eventSubscriber = provider.GetService <IEventStoreSubscriber>(); if (eventSubscriber.IsStarted) { return; } var position = readPointer.Position < 0 ? null : readPointer.Position; eventSubscriber.Start(position); } }
public ValuesEventConsumer(IOptions <SubscriberOptions> options, IMongoClient mongoClient, ILogger <ValuesEventConsumer> logger, IReadModelRepository <ValueRecord> valueRecordsRepository, IReadModelRepository <ReadPointer> readPointerRepository, IEventStoreConnection eventStoreConnection) : base(options, eventStoreConnection) { _mongoClient = mongoClient; _logger = logger; _valueRecordsRepository = valueRecordsRepository; _readPointerRepository = readPointerRepository; // there must be at least one record!!! _readPointer = _readPointerRepository.GetAll() .First(x => x.SourceName == options.Value.TopicName); }