Я работаю с DDD уже несколько месяцев и наткнулся на несколько вещей, в которых не уверен.
Рассмотрим упрощенный пример добавления Product
к объекту Order
. Из нашего контроллера у нас будет int
, переданный через пользовательский интерфейс, который представляет Product
в базе данных. Какой из следующих двух примеров правильный (дайте мне знать, если они оба неверны)?
Пример 1:
public class OrderController
{
// Injected Repositories
private readonly IProductRepository _productRepository;
// Called by UI
public void AddProduct(int productId)
{
Order order = ...; // Persisted Order
Product product = _productRepository.GetProduct(productId);
order.AddProduct(product);
}
}
Контроллер создает экземпляр самого Продукта и добавляет его с помощью метода:
void AddProduct(Product product)
{
productList.Add(product);
}
Пример 2:
public class OrderController
{
// Injected Repositories
private readonly IProductRepository _productRepository;
// Called by UI
public void AddProduct(int productId)
{
Order order = ...; // Persisted Order
order.AddProduct(productId, _productRepository);
}
}
Модель предметной области Order
имеет репозиторий внедренного продукта, переданный ей, и она получает Продукт и добавляет:
Product AddProduct(int productId, IProductRepository productRepository)
{
Product product = productRepository.GetProduct(productId);
productList.Add(product);
return product;
}
В настоящее время я перешел к первому примеру, потому что ваша модель предметной области никогда не должна вызывать служебный метод изнутри, однако в последнее время я видел несколько примеров, в которых используется мой второй пример, и он выглядит аккуратно. Мне кажется, что Пример 1 находится на грани Anemic. Пример 2 переместит всю логику добавления продукта в саму модель предметной области.