在微服务中,根据干净架构,这可能是一项服务:
但是由于我将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”具有依赖性。
老实说,只有您知道问题的答案。从外观上看,尽管命名为“ GetBasketByBuyerIdCommand”,看来您只在代码中运行查询。因此,这意味着您仅在CQRS的“ Q”上工作,并且从该角度来看,您正在做的事情还不错。
我认为,您问题的答案取决于体系结构的其余部分,尤其是此时您要尝试实现的目标。如果希望您的BasketModule和CatalogModule在将来的某个地方完全独立,那么现在采取的这种选择可能会对将来产生很大的影响。
例如,如果稍后您希望将两个模块分为两个不同的微服务,则必须提出一种不同的方式来执行您描述的查询。如何处理这个问题本身就是一个全新的对话。