private static void Main(string[] args) { ObjectContainer.SetContainer(new AutofacContainerObject()); var applictionInitializer = new EventHandleProvider(); applictionInitializer.Initialize(Assembly.GetExecutingAssembly()); var commandInitializer = new CommandHandleProvider(); commandInitializer.Initialize(Assembly.GetExecutingAssembly()); ObjectContainer.RegisterInstance(applictionInitializer); ObjectContainer.RegisterInstance(commandInitializer); var dbConnection = new MySqlConnection(_mysqlConnection); var persistence = new SnapshotPersistence(dbConnection); var binarySerializer = new DefaultBinarySerializer(); var snapshotRepository = new SnapshotRepository(persistence, new SnapshotFactory(binarySerializer)); var eventPersistence = new EventStorePersistence(dbConnection); var eventFactory = new EventStreamFactory(binarySerializer); var eventStore = new EventStore(eventPersistence, eventFactory); IRepository repository = new EventSouringRepository(eventStore, snapshotRepository); var comamndHandler = ObjectContainer.Resolve<CommandHandleProvider>(); var changePasswordCommand = new ChangePasswordCommand("90ca0d59-65e6-403b-82c5-8df967cc8e22", "2222222", "11111"); var commandContext = new CommandContext(repository); var commandHanldeAction = comamndHandler.GetInternalCommandHandle(typeof(ChangePasswordCommand)); commandHanldeAction(commandContext, changePasswordCommand); var aggregateRoots = commandContext.AggregateRoots; IList<IEvent> unCommitEvents = null; foreach (var item in aggregateRoots) { unCommitEvents = item.Value.Commit(); } var aggregateRoot = aggregateRoots.FirstOrDefault().Value; eventStore.AppendToStream(aggregateRoot.AggregateRootId, new EventStream(aggregateRoot.Version, unCommitEvents)); snapshotRepository.Create(aggregateRoot); Console.WriteLine("改方法执行完毕..."); }
public When_getting_a_snapshot_aggregate_with_no_snapshot() { var eventStore = new TestEventStore(); var snapshotStore = new NullSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(snapshotStore, snapshotStrategy, new Repository(eventStore), eventStore); var session = new Session(repository); _aggregate = session.Get<TestSnapshotAggregate>(Guid.NewGuid()); }
public void Setup() { var eventStore = new TestEventStore(); var snapshotStore = new NullSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(snapshotStore, snapshotStrategy, new Repository(eventStore), eventStore); var session = new Session(repository); _aggregate = session.Get<TestSnapshotAggregate>(Guid.NewGuid()); }
public When_getting_snapshotable_aggreate() { var eventStore = new TestInMemoryEventStore(); _snapshotStore = new TestSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(eventStore), eventStore); var session = new Session(repository); _aggregate = session.Get<TestSnapshotAggregate>(Guid.NewGuid()); }
public When_getting_an_aggregate_with_snapshot() { var eventStore = new TestInMemoryEventStore(); var eventPublisher = new TestEventPublisher(); var snapshotStore = new TestSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var snapshotRepository = new SnapshotRepository(snapshotStore, snapshotStrategy, new Repository(eventStore, eventPublisher), eventStore); var session = new Session(snapshotRepository); _aggregate = session.Get<TestSnapshotAggregate>(Guid.NewGuid()); }
public void Setup() { var eventStore = new TestInMemoryEventStore(); _snapshotStore = new TestSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(eventStore), eventStore); var session = new Session(repository); var aggregate = new TestSnapshotAggregate(); for (var i = 0; i < 200; i++) { aggregate.DoSomething(); } session.Add(aggregate); session.Commit(); }
public When_saving_a_snapshotable_aggregate_for_each_change() { IEventStore eventStore = new TestInMemoryEventStore(); _snapshotStore = new TestInMemorySnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(eventStore), eventStore); _session = new Session(repository); _aggregate = new TestSnapshotAggregate(); for (var i = 0; i < 150; i++) { _session.Add(_aggregate); _aggregate.DoSomething(); _session.Commit(); } }
public When_saving_a_snapshotable_aggregate() { var eventStore = new TestInMemoryEventStore(); var eventPublisher = new TestEventPublisher(); _snapshotStore = new TestSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(eventStore, eventPublisher), eventStore); var session = new Session(repository); var aggregate = new TestSnapshotAggregate(); for (var i = 0; i < 30; i++) { aggregate.DoSomething(); } session.Add(aggregate); session.Commit(); }
public void Setup() { IEventStore eventStore = new TestInMemoryEventStore(); var eventPublisher = new TestEventPublisher(); _snapshotStore = new TestInMemorySnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(eventStore, eventPublisher), eventStore); _session = new Session(repository); var aggregate = new TestSnapshotAggregate(); for (int i = 0; i < 20; i++) { _session.Add(aggregate); aggregate.DoSomething(); _session.Commit(); } }
public When_saving_a_snapshotable_aggregate() { _eventStore = new TestInMemoryEventStore(); _snapshotStore = new TestSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(_eventStore), _eventStore); var session = new Session(repository); var aggregate = new TestSnapshotAggregate(); _token = new CancellationToken(); for (var i = 0; i < 200; i++) { aggregate.DoSomething(); } Task.Run(async() => { await session.Add(aggregate, _token); await session.Commit(_token); }).Wait(); }
public void Setup() { var eventStore = new TestInMemoryEventStore(); var eventPublisher = new TestEventPublisher(); _snapshotStore = new TestSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy <ISingleSignOnToken>(); var dependencyResolver = new TestDependencyResolver(null); var aggregateFactory = new AggregateFactory(dependencyResolver, dependencyResolver.Resolve <ILogger>()); var repository = new SnapshotRepository <ISingleSignOnToken>(_snapshotStore, snapshotStrategy, new Repository <ISingleSignOnToken>(aggregateFactory, eventStore, eventPublisher, new NullCorrelationIdHelper()), eventStore, aggregateFactory); var session = new UnitOfWork <ISingleSignOnToken>(repository); var aggregate = new TestSnapshotAggregate(); for (int i = 0; i < 30; i++) { aggregate.DoSomething(); } session.Add(aggregate); session.Commit(); }
public Specification() { var eventpublisher = new SpecEventPublisher(); var eventstorage = new SpecEventStorage(eventpublisher, Given().ToList()); var snapshotstorage = new SpecSnapShotStorage(Snapshot); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(snapshotstorage, snapshotStrategy, new Repository(eventstorage), eventstorage); Session = new Session(repository); Aggregate = GetAggregate().Result; var handler = BuildHandler(); handler.Handle(When()); Snapshot = snapshotstorage.Snapshot; PublishedEvents = eventpublisher.PublishedEvents; EventDescriptors = eventstorage.Events; }
public void ShouldApplyEventsAfterSnapshot() { var rootId = Guid.NewGuid(); var eventBus = new MemoryEventBus(); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly); var snapShotRepo = new SnapshotRepository(); var factory = new AggregateFactory(eventStore, snapShotRepo); var productAggregate = factory.Create <ProductCatalogAggregate>(rootId); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Acer Aspire 3", "Notebook Acer Aspire 3 A315-53-348W Intel Core i3-6006U RAM de 4GB HD de 1TB Tela de 15.6” HD Windows 10")); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Asus Vivobook", "Notebook Asus Vivobook X441B-CBA6A de 14 Con AMD A6-9225/4GB Ram/500GB HD/W10")); eventStore.AppendToStream <ProductCatalogAggregate>(productAggregate.Id, productAggregate.Version, productAggregate.Changes); var stream = eventStore.LoadEventStream(rootId); snapShotRepo.SaveSnapshot(rootId, productAggregate, stream.Version); productAggregate = factory.Load <ProductCatalogAggregate>(rootId); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook 2 em 1 Dell", "Notebook 2 em 1 Dell Inspiron i14-5481-M11F 8ª Geração Intel Core i3 4GB 128GB SSD 14' Touch Windows 10 Office 365 McAfe")); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Gamer Dell", "Notebook Gamer Dell G3-3590-M60P 9ª Geração Intel Core i7 8GB 512GB SSD Placa Vídeo NVIDIA 1660Ti 15.6' Windows 10")); productAggregate.CreateProduct(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook Lenovo 2 em 1 ideapad C340", "Notebook Lenovo 2 em 1 ideapad C340 i7-8565U 8GB 256GB SSD Win10 14' FHD IPS - 81RL0001BR")); eventStore.AppendToStream <ProductCatalogAggregate>(productAggregate.Id, productAggregate.Version, productAggregate.Changes); ProductCatalogAggregate root; long snapshotVersion = 0; var snap = snapShotRepo.TryGetSnapshotById(rootId, out root, out snapshotVersion); stream = eventStore.LoadEventStreamAfterVersion(rootId, snapshotVersion); var aggregateReloadedFromSnapshot = factory.Load <ProductCatalogAggregate>(rootId); Assert.True(snap); Assert.True(root != null); Assert.True(3 == snapshotVersion); Assert.True(stream.Events.Count == 3); Assert.True(aggregateReloadedFromSnapshot.Changes.Count == 0); Assert.True(aggregateReloadedFromSnapshot.Id == rootId); Assert.True(aggregateReloadedFromSnapshot.CountProducts() == 5); }
public ConditionalWhenSpecification() { var eventpublisher = new SpecEventPublisher(); var eventstorage = new SpecEventStorage(eventpublisher, Given().ToList()); var snapshotstorage = new SpecSnapShotStorage(Snapshot); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(snapshotstorage, snapshotStrategy, new Repository(eventstorage), eventstorage); Session = new Session(repository); Aggregate = GetAggregate().Result; if (this.InvokeBuildWhenOnConstruct) { Task.Run(() => this.InvokeBuildWhen()).Wait(); } Snapshot = snapshotstorage.Snapshot; PublishedEvents = eventpublisher.PublishedEvents; EventDescriptors = eventstorage.Events; }
public SaveSnapshotableAggregateForEachChange() { IEventStore eventStore = new TestInMemoryEventStore(); _snapshotStore = new TestInMemorySnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(_snapshotStore); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(eventStore), eventStore); var eventStoreSettings = new TestEventStoreSettings { SessionLockEnabled = false }; _session = new Session(repository, eventStoreSettings, null); _aggregate = new TestSnapshotAggregate(); for (var i = 0; i < 150; i++) { _session.Add(_aggregate); _aggregate.DoSomething(); _session.CommitAsync().Wait(); } }
public void Setup() { IEventStore <ISingleSignOnToken> eventStore = new TestInMemoryEventStore(); var eventPublisher = new TestEventPublisher(); _snapshotStore = new TestInMemorySnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy <ISingleSignOnToken>(); var dependencyResolver = new TestDependencyResolver(null); var aggregateFactory = new AggregateFactory(dependencyResolver, dependencyResolver.Resolve <ILogger>()); var repository = new SnapshotRepository <ISingleSignOnToken>(_snapshotStore, snapshotStrategy, new AggregateRepository <ISingleSignOnToken>(aggregateFactory, eventStore, eventPublisher, new NullCorrelationIdHelper(), new ConfigurationManager()), eventStore, aggregateFactory); _unitOfWork = new UnitOfWork <ISingleSignOnToken>(repository); _aggregate = new TestSnapshotAggregate(); for (var i = 0; i < 20; i++) { _unitOfWork.Add(_aggregate); _aggregate.DoSomething(); _unitOfWork.Commit(); } }
public When_saving_a_snapshotable_aggregate_with_custom_interval() { IEventStore eventStore = new TestInMemoryEventStore(); _snapshotStore = new TestInMemorySnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(23); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(eventStore), eventStore); _session = new Session(repository); _aggregate = new TestSnapshotAggregate(Guid.NewGuid()); Task.Run(async() => { for (var i = 0; i < 50; i++) { await _session.Add(_aggregate); _aggregate.DoSomething(); await _session.Commit(); } }).Wait(); }
public WhenSavingASnapshotableAggregate() { var eventStore = new TestInMemoryEventStore(); _snapshotStore = new TestSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(_snapshotStore); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(eventStore), eventStore); var session = new Session(repository); var aggregate = new TestSnapshotAggregate(); for (var i = 0; i < 200; i++) { aggregate.DoSomething(); } Task.Run(async() => { session.Add(aggregate); await session.CommitAsync(); }).Wait(); }
public void Run() { var eventstorage = new SpecEventStorage(Given().ToList()); var snapshotstorage = new SpecSnapShotStorage(Snapshot); var eventpublisher = new SpecEventPublisher(); var snapshotStrategy = new DefaultSnapshotStrategy(); var repository = new SnapshotRepository(snapshotstorage, snapshotStrategy, new Repository(eventstorage, eventpublisher), eventstorage); Session = new Session(repository); Aggregate = Session.GetAsync <TAggregate>(Guid.Empty).Result; var handler = BuildHandler(); handler.HandleAsync(When()); Snapshot = snapshotstorage.Snapshot; PublishedEvents = eventpublisher.PublishedEvents; EventDescriptors = eventstorage.Events; }
public ActionResult SaveSnapshot(string bank, string bankType, string amount, string date) { var accountId = HttpContext.Session.Get <long>(SessionHelper.SessionKeyAccountId); if (accountId == default) { return(RedirectToAction("Login", "Account", new { id = LoginHelper.BudgetApp })); } if (string.IsNullOrWhiteSpace(bank)) { return(Json(new { status = false, message = "Bank is required" })); } if (string.IsNullOrWhiteSpace(bankType)) { return(Json(new { status = false, message = "Bank Type is required" })); } if (string.IsNullOrWhiteSpace(amount)) { return(Json(new { status = false, message = "Amount is required" })); } if (!decimal.TryParse(amount, out decimal amountValue)) { return(Json(new { status = false, message = "Amount is required" })); } if (string.IsNullOrWhiteSpace(date)) { return(Json(new { status = false, message = "Date is required" })); } if (!DateTime.TryParse(date, out DateTime dateValue)) { return(Json(new { status = false, message = "Date is required" })); } var bankId = BankHelper.GetOrAddBankId(bank); var bankTypeId = BankHelper.GetBankTypeId(bankType); SnapshotRepository.AddSnapshot(accountId, bankId, bankTypeId, amountValue, dateValue); return(Json(new { status = true, message = "Snapshot Added" })); }
public SaveNotSnapshotableAggregate() { _eventStore = new TestInMemoryEventStore(); _snapshotStore = new TestSnapshotStore(); var snapshotStrategy = new DefaultSnapshotStrategy(_snapshotStore); var repository = new SnapshotRepository(_snapshotStore, snapshotStrategy, new Repository(_eventStore), _eventStore); var eventStoreSettings = new TestEventStoreSettings { SessionLockEnabled = false }; var session = new Session(repository, eventStoreSettings, null); var aggregate = new TestAggregate(Guid.NewGuid().ToString()); for (var i = 0; i < 200; i++) { aggregate.DoSomething(); } Task.Run(async() => { session.Add(aggregate); await session.CommitAsync(); }).Wait(); }
public void Run() { var eventstorage = new SpecEventStorage(Given().ToList()); var snapshotstorage = new SpecSnapShotStorage(Snapshot); var eventpublisher = new SpecEventPublisher(); var aggregateFactory = new AggregateFactory(null, new ConsoleLogger(new LoggerSettings(), new CorrelationIdHelper(new ThreadedContextItemCollectionFactory()))); var snapshotStrategy = new DefaultSnapshotStrategy <ISingleSignOnToken>(); var repository = new SnapshotRepository <ISingleSignOnToken>(snapshotstorage, snapshotStrategy, new AggregateRepository <ISingleSignOnToken>(aggregateFactory, eventstorage, eventpublisher, new NullCorrelationIdHelper(), new ConfigurationManager()), eventstorage, aggregateFactory); UnitOfWork = new UnitOfWork <ISingleSignOnToken>(repository); Aggregate = UnitOfWork.Get <TAggregate>(Guid.Empty); var handler = BuildHandler(); handler.Handle(When()); Snapshot = snapshotstorage.Snapshot; PublishedEvents = eventpublisher.PublishedEvents; EventDescriptors = eventstorage.Events; }
public void ShouldMergeEvents() { var eventBus = new MemoryEventBus(new MemoryResolver()); var appendOnly = new MemoryAppendOnlyStore(eventBus); var eventStore = new EventStore(appendOnly, eventBus); var snapShotRepo = new SnapshotRepository(); var factory = new AggregateFactory(eventStore, snapShotRepo); var rootId = Guid.NewGuid(); var handler = new ProductServiceCommandHandler(eventStore, factory); handler.Execute(new CreateProductCatalog(rootId)); var prodId = Guid.NewGuid(); handler.Execute(new CreateProductCommand(rootId, prodId, "Notebook Lenovo 2 em 1 ideapad C340", "Notebook Lenovo 2 em 1 ideapad C340 i7-8565U 8GB 256GB SSD Win10 14' FHD IPS - 81RL0001BR")); var threads = new List <Task>(); threads.Add(Task.Run(() => { var handlerThread1 = new ProductServiceCommandHandler(eventStore, factory); handlerThread1.Execute(new CreateProductCommand(rootId, Guid.NewGuid(), "Notebook 2 em 1 Dell", "Notebook 2 em 1 Dell Inspiron i14-5481-M11F 8ª Geração Intel Core i3 4GB 128GB SSD 14' Touch Windows 10 Office 365 McAfe")); })); threads.Add(Task.Run(() => { var handlerThread2 = new ProductServiceCommandHandler(eventStore, factory); handlerThread2.Execute(new ChangeProductNameCommand(rootId, prodId, "Novo nome")); })); Task.WaitAll(threads.ToArray()); var stream = eventStore.LoadEventStream(rootId); var productChanged = (ProductNameChanged)stream.Events.Where(x => x.GetType() == typeof(ProductNameChanged)).FirstOrDefault(); Assert.True(4 == stream.Version); Assert.True("Novo nome" == productChanged.Name); }
protected override void Load( ContainerBuilder builder) { builder .Register(ctx => BalanceUpdateRepository.Create( _connectionString, ctx.Resolve <ILogFactory>() )) .As <IBalanceUpdateRepository>() .SingleInstance(); builder .Register(ctx => ClaimedGasAmountRepository.Create( _connectionString, ctx.Resolve <ILogFactory>() )) .As <IClaimedGasAmountRepository>() .SingleInstance(); builder .Register(ctx => DistributionPlanRepository.Create( _connectionString, ctx.Resolve <ILogFactory>(), ctx.Resolve <IChaosKitty>() )) .As <IDistributionPlanRepository>() .SingleInstance(); builder .Register(ctx => SnapshotRepository.Create( _connectionString, ctx.Resolve <ILogFactory>(), ctx.Resolve <IChaosKitty>() )) .As <ISnapshotRepository>() .SingleInstance(); }
public SnapshotSummaryModel(long accountId) { Snapshots = SnapshotRepository.GetAccountSnapshots(accountId).OrderByDescending(s => s.SnapShotDate).ToList(); MonthlyBankSnapshots = new List <SnapshotTable>(); MonthlyBankTypeSnapshots = new List <SnapshotTable>(); MonthlyAllSnapshots = new List <SnapshotTable>(); YearlyBankSnapshots = new List <SnapshotTable>(); YearlyBankTypeSnapshots = new List <SnapshotTable>(); YearlyAllSnapshots = new List <SnapshotTable>(); var tempMonthlyBankSnapshots = new List <Snapshot>(); var tempMonthlyBankTypeSnapshots = new List <Snapshot>(); var tempMonthlyAllSnapshots = new List <Snapshot>(); var tempYearlyBankSnapshots = new List <Snapshot>(); var tempYearlyBankTypeSnapshots = new List <Snapshot>(); var tempYearlyAllSnapshots = new List <Snapshot>(); foreach (var snapShot in Snapshots) { var month = snapShot.SnapShotDate.Month; var year = snapShot.SnapShotDate.Year; var bank = snapShot.Bank; var bankType = snapShot.BankType; if (!tempMonthlyBankSnapshots.Any(s => s.SnapShotDate.Month == month && s.SnapShotDate.Year == year && s.Bank == bank && s.BankType == bankType)) { tempMonthlyBankSnapshots.Add(snapShot); } if (!tempMonthlyBankTypeSnapshots.Any(s => s.SnapShotDate.Month == month && s.SnapShotDate.Year == year && s.Bank == bank && s.BankType == bankType)) { tempMonthlyBankTypeSnapshots.Add(snapShot); } if (!tempMonthlyAllSnapshots.Any(s => s.SnapShotDate.Month == month && s.SnapShotDate.Year == year && s.Bank == bank && s.BankType == bankType)) { tempMonthlyAllSnapshots.Add(snapShot); } if (!tempYearlyBankSnapshots.Any(s => s.SnapShotDate.Year == year && s.Bank == bank && s.BankType == bankType)) { tempYearlyBankSnapshots.Add(snapShot); } if (!tempYearlyBankTypeSnapshots.Any(s => s.SnapShotDate.Year == year && s.Bank == bank && s.BankType == bankType)) { tempYearlyBankTypeSnapshots.Add(snapShot); } if (!tempYearlyAllSnapshots.Any(s => s.SnapShotDate.Year == year && s.Bank == bank && s.BankType == bankType)) { tempYearlyAllSnapshots.Add(snapShot); } } MonthlyBankSnapshots = tempMonthlyBankSnapshots.GroupBy(s => s.Bank).Select(g => new SnapshotTable(g.Key, g.GroupBy(s => new { s.SnapShotDate.Month, s.SnapShotDate.Year }).Select(i => new TableRow { Month = i.Key.Month, Year = i.Key.Year, Amount = i.Sum(x => x.Amount) }))).OrderBy(o => o.Title).ToList(); MonthlyBankTypeSnapshots = tempMonthlyBankTypeSnapshots.GroupBy(s => s.BankType).Select(g => new SnapshotTable(g.Key, g.GroupBy(s => new { s.SnapShotDate.Month, s.SnapShotDate.Year }).Select(i => new TableRow { Month = i.Key.Month, Year = i.Key.Year, Amount = i.Sum(x => x.Amount) }))).OrderBy(o => o.Title).ToList(); MonthlyAllSnapshots = tempMonthlyAllSnapshots.GroupBy(s => new { s.Bank, s.BankType }).Select(g => new SnapshotTable($"{g.Key.Bank} - {g.Key.BankType}", g.GroupBy(s => new { s.SnapShotDate.Month, s.SnapShotDate.Year }).Select(i => new TableRow { Month = i.Key.Month, Year = i.Key.Year, Amount = i.Sum(x => x.Amount) }))).OrderBy(o => o.Title).ToList(); YearlyBankSnapshots = tempYearlyBankSnapshots.GroupBy(s => s.Bank).Select(g => new SnapshotTable(g.Key, g.GroupBy(s => s.SnapShotDate.Year).Select(i => new TableRow { Month = 1, Year = i.Key, Amount = i.Sum(x => x.Amount) }))).OrderBy(o => o.Title).ToList(); YearlyBankTypeSnapshots = tempYearlyBankTypeSnapshots.GroupBy(s => s.BankType).Select(g => new SnapshotTable(g.Key, g.GroupBy(s => s.SnapShotDate.Year).Select(i => new TableRow { Month = 1, Year = i.Key, Amount = i.Sum(x => x.Amount) }))).OrderBy(o => o.Title).ToList(); YearlyAllSnapshots = tempYearlyAllSnapshots.GroupBy(s => new { s.Bank, s.BankType }).Select(g => new SnapshotTable($"{g.Key.Bank} - {g.Key.BankType}", g.GroupBy(s => s.SnapShotDate.Year).Select(i => new TableRow { Month = 1, Year = i.Key, Amount = i.Sum(x => x.Amount) }))).OrderBy(o => o.Title).ToList(); SnapshotTotal = Snapshots.GroupBy(s => new { s.Bank, s.BankType }).Sum(s => s.OrderByDescending(i => i.SnapShotDate).First().Amount); }
public static IEvent[] CreateEvents(string key, Func <string, ITableSnapshotBuilder> currentQuerySnapshotBuilderDelegate, Func <string, ITableSnapshotBuilder> lastSnapshotBuilderDelegate, SnapshotRepository snapshotRepository, bool persistAsLastSnapshot, ILogger logger, Func <IDataRecord, EventType, IEvent> factoryCallback) { Guard.ArgumentNotNullOrEmptyString(key, nameof(key)); Guard.ArgumentNotNull(currentQuerySnapshotBuilderDelegate, nameof(currentQuerySnapshotBuilderDelegate)); Guard.ArgumentNotNull(lastSnapshotBuilderDelegate, nameof(lastSnapshotBuilderDelegate)); Guard.AssertNotNull(logger); Guard.AssertNotNull(snapshotRepository); List <IEvent> events = new List <IEvent>(); using (DisposableFile temporarySnapshot = DisposableFile.GetTempFile()) { Task <ITableSnapshot> queryNow = Task.Factory.StartNew <ITableSnapshot>(() => { ITableSnapshotBuilder builder = currentQuerySnapshotBuilderDelegate(temporarySnapshot.Path); ITableSnapshot snapShotFromRequest = builder.Build(); return(snapShotFromRequest); }); Task <ITableSnapshot> lastSnapshot1 = Task.Factory.StartNew <ITableSnapshot>(() => { string localTempFile = Path.GetTempFileName(); //DELETE The File at the end ?? ITableSnapshotBuilder builder = lastSnapshotBuilderDelegate(localTempFile); ITableSnapshot snapShotFromRequest = builder.Build(); return(snapShotFromRequest); }); int msTimeoutLoggingSteps = 1000; while (Task.WaitAll(new Task[] { queryNow, lastSnapshot1 }, msTimeoutLoggingSteps) == false) { logger.LogTrace("CreateEvents.Wait-Loop.{0}ms for '{1}'", msTimeoutLoggingSteps, key); } try { TableDiffByLookup differ = new TableDiffByLookup(lastSnapshot1.Result, queryNow.Result); differ.DifferencesDelegate = (deletedRecord, inserted) => { EventType et = EventType.Created; IDataRecord template = inserted; if ((deletedRecord != null) && (inserted != null)) { et = EventType.Modified; template = inserted; } if ((deletedRecord != null) && (inserted == null)) { et = EventType.Deleted; template = deletedRecord; //RepositoryTableSnapshot.CreatedAtFieldName } if (et != EventType.Modified) { //IEvent ev = //EventFactory.CreateRepositoryEvent(template, et); IEvent ev = factoryCallback(template, et); Guard.AssertNotNull(ev); events.Add(ev); } else { // we ignore modifications! } }; differ.Execute(); } finally { if (queryNow.IsCompletedSuccessfully()) { queryNow.Result.Dispose(); } if (lastSnapshot1.IsCompletedSuccessfully()) { lastSnapshot1.Result.Dispose(); } } if (persistAsLastSnapshot) { snapshotRepository.Push(key, temporarySnapshot.Path); } else { logger.LogInformation("Snapshot {0} NOT persited!", key); } } //using temporary snapshotfile disposable return(events.ToArray()); //throw new NotImplementedException(); }