Предисловие об архитектуре
В микросервисе это может быть сервис в соответствии с чистой архитектурой:
КорзинаСервис
- Api
- Application [CQRS]
- Core
- Инфраструктура
- Application [CQRS]
Каталог
- Api
- Application [CQRS]
- Core
- Инфраструктура
- Application [CQRS]
Но поскольку я применяю DDD к монолиту, в настоящее время я могу удалить свой слой Api и иметь меньше «проектов» / модулей. Таким образом, каждый модуль (например, корзина и каталог) в настоящее время содержит 3 проекта:
- Application
- Core
- Инфраструктура
Оба имеют зависимость от .Core
Описание проблемы
В моем приложении есть BasketModule и CatalogModule. Было бы правильно получать информацию из CatalogModule (который содержит продукты) с помощью Mediator следующим образом:
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));
Это правильно? Я не говорю об остальной части кода примера, а конкретно о вызове посредника для получения продукта и о зависимости проекта «Корзина.Приложение» от «Каталог.Приложение».