コード例 #1
0
ファイル: Program.cs プロジェクト: liuxiqin/Sevens
        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());
 }
コード例 #4
0
        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());
        }
コード例 #5
0
        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());
        }
コード例 #6
0
 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();
            }
        }
コード例 #8
0
 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();
            }
        }
コード例 #10
0
        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();
        }
コード例 #11
0
        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();
        }
コード例 #12
0
        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;
        }
コード例 #13
0
        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);
        }
コード例 #14
0
        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;
        }
コード例 #15
0
        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();
        }
コード例 #18
0
        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();
        }
コード例 #19
0
ファイル: Specification.cs プロジェクト: bpirson/CQRSlite
        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;
        }
コード例 #20
0
        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" }));
        }
コード例 #21
0
        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();
        }
コード例 #22
0
ファイル: Specification.cs プロジェクト: tuga1975/CQRS
        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;
        }
コード例 #23
0
        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);
        }
コード例 #24
0
        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();
        }
コード例 #25
0
        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);
        }
コード例 #26
0
        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();
        }