Какой из этих примеров представляет правильное использование DDD?

Я работаю с 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 переместит всю логику добавления продукта в саму модель предметной области.

5
задан djdd87 10 November 2010 в 16:03
поделиться