コード例 #1
0
        public static async Task OrderAsync()
        {
            Customer greatCustomer = null;
            Article  article       = null;
            Article  article2      = null;

            greatCustomer = await GetOrCreateGreatCustomerAsync().ConfigureAwait(false);

            article = await GetOrCreateAggregateAsync <ArticleViewModel, Article>(readRepository, x => x.Articlenumber == "A12345", () => new Article(ArticleId.Generate(), "A12345", "A great article", Money.EUR(99.99m)))
                      .ConfigureAwait(false);

            article2 = await GetOrCreateAggregateAsync <ArticleViewModel, Article>(readRepository, x => x.Articlenumber == "B12345", () => new Article(ArticleId.Generate(), "B12345", "Another great article", Money.EUR(59.99m)))
                       .ConfigureAwait(false);

            var shoppingCart         = new ShoppingCart(ShoppingCartId.Generate(), greatCustomer.Id, greatCustomer.StateModel.Name);
            var shoppingCartArticle1 = await shoppingCart.PlaceArticleAsync(ShoppingCartArticleId.Generate(shoppingCart.Id), article.Id, 1, repository);

            await shoppingCart.PlaceArticleAsync(ShoppingCartArticleId.Generate(shoppingCart.Id), article2.Id, 1, repository);

            shoppingCartArticle1.RemoveFromShoppingCart();

            shoppingCart.Order(repository);

            await repository.SaveAsync(shoppingCart);

            var projection = CustomerState.LoadState(greatCustomer.StateModel);
        }
コード例 #2
0
        public static BusinessRule <ShoppingCart> CanPlaceArticle(ShoppingCartArticleId shoppingCartArticleId, ArticleId articleId, IEventRepository repository)
        {
            return(new BusinessRule <ShoppingCart>(
                       "Cannot place article into shopping cart!",
                       rule =>
            {
                rule.AddCheck(ShoppingCartSpecifications.IsActive, "Shopping cart is deactivated!");
                rule.AddCheck(_ => shoppingCartArticleId != ShoppingCartArticleId.Empty, "Id is empty!");
                rule.AddCheck(_ =>
                {
                    var article = repository.GetAsync <Article>(articleId).Result;

                    return article?.StateModel.Active == true;
                }, $"Article does not exist or is deactivated!!");
            }));
        }
コード例 #3
0
        public async Task <ShoppingCartArticle> PlaceArticleAsync(ShoppingCartArticleId shoppingCartArticleId, ArticleId articleId, int quantity, IEventRepository repository)
        {
            ShoppingCartBusinessRules.CanPlaceArticle(shoppingCartArticleId, articleId, repository).Check(this);

            var article = await repository.GetAsync <Article>(articleId);

            var shoppingCartArticle = new ShoppingCartArticle(
                this,
                shoppingCartArticleId,
                article.Id,
                article.StateModel.Articlenumber,
                article.StateModel.Description,
                article.StateModel.Price, quantity,
                article.StateModel.Price * quantity,
                DateTime.UtcNow);

            // or: RaiseEvent(new ShoppingCartArticlePlaced(aggregateRoot.Id, shoppingCartArticleId, articleId, articlenumber, description, price, quantity, total, dateTime ?? DateTime.UtcNow));
            // var shoppingCartArticle = GetChildEntity<ShoppingCartArticle>(shoppingCartArticleId);

            return(shoppingCartArticle);
        }
コード例 #4
0
        public async Task OrderArticle(OrderArticle command)
        {
            string       wkId  = null;
            ShoppingCart wkAgg = null;
            var          wk    = (await Program.readRepository.QueryAsync <ShoppingCartViewModel>(x => x.CustomersId == command.CustomerId && x.Status == (int)ShoppingCartStatus.Open))
                                 .FirstOrDefault();

            if (wk == null)
            {
                var customer = (await Program.readRepository.QueryAsync <CustomerViewModel>(x => x.Streamname == command.CustomerId))
                               .FirstOrDefault();

                wkId  = Guid.NewGuid().ToString();
                wkAgg = new ShoppingCart(wkId, command.CustomerId, customer.Name);
            }
            else
            {
                wkAgg = await Program.repository.GetAsync <ShoppingCart>(wk.Streamname);
            }

            await wkAgg.PlaceArticleAsync(ShoppingCartArticleId.Generate(wkAgg.Id), command.ArticleId, command.Quantity, Program.repository);

            await Program.repository.SaveAsync(wkAgg);
        }