跨越DDD整体中的服务/模块时,将在我的处理程序中调用中介是正确的

问题描述 投票:0回答:1

关于体系结构的序言

在微服务中,根据干净架构,这可能是一项服务:

BasketService

  • Api
    • 应用[CQRS]
      • 核心
    • 基础设施

CatalogService

  • Api
    • 应用[CQRS]
      • 核心
    • 基础设施

但是由于我将DDD应用于整体,因此我目前可以删除我的Api层,并且具有更少的“项目” /模块。因此,每个模块(例如购物篮和目录)当前包含3个项目:

  • 应用
    • 核心
  • 基础设施

都依赖于.Core

问题描述

我的应用程序有一个BasketModule和CatalogModule。像这样通过Mediator从CatalogModule(包含产品)中获取信息是否正确:

public Task<BasketDTO> Handle(GetBasketByBuyerIdCommand request, CancellationToken cancellationToken)
    {
        BasketDTO result;
        var basket = m_basketRepo.GetById(request.BuyerId);

        if (basket == null)
        {
            result = new BasketDTO()
            {
                BuyerId = request.BuyerId,
                Items = new List<BasketItem>()
            };
            return Task.FromResult(result);
        }

        //Could be automapper, but not now currently //ignore
        var products = new List<DTO.Product>();

        foreach (var item in basket.Items)
        {
          var product = m_mediator.Send(new GetProductByIdQuery(item.ProductId)).Result; //ignore the non-async. It's example code 

            products.Add(new DTO.Product()
            {
                Id = product.Id,
                Price = product.Price,
                Title = product.Title
            });
        }

        result = new BasketDTO()
        {
            BuyerId = basket.BuyerId,
            Items = basket.Items
            .Select(dl => new DTO.BasketItem()
            {

                ProductId = dl.ProductId,
                Quantity = dl.Quantity,
                Product = products
                .Where(cl => cl.Id == dl.ProductId)
                .FirstOrDefault()
            }).ToList()
        };

        return Task.FromResult(result);
    }
}

关于以下几行:

 var product = await m_mediator.Send(new GetProductByIdQuery(item.ProductId));

这是正确的吗?我不是在讨论示例代码的其余部分,而是在专门讨论调用中介程序来获取产品,并使项目“ Basket.Application”对“ Catalog.Application”具有依赖性。

c# domain-driven-design cqrs clean-architecture
1个回答
0
投票

老实说,只有您知道问题的答案。从外观上看,尽管命名为“ GetBasketByBuyerIdCommand”,看来您只在代码中运行查询。因此,这意味着您仅在CQRS的“ Q”上工作,并且从该角度来看,您正在做的事情还不错。

我认为,您问题的答案取决于体系结构的其余部分,尤其是此时您要尝试实现的目标。如果希望您的BasketModule和CatalogModule在将来的某个地方完全独立,那么现在采取的这种选择可能会对将来产生很大的影响。

例如,如果稍后您希望将两个模块分为两个不同的微服务,则必须提出一种不同的方式来执行您描述的查询。如何处理这个问题本身就是一个全新的对话。

© www.soinside.com 2019 - 2024. All rights reserved.