以下哪些例子代表正确使用DDD?

djd*_*d87 5 c# design-patterns domain-driven-design

我已经和DDD合作了几个月了,我遇到了一些我不确定的事情.

采取添加的简单的例子Product,以一个Order对象.从我们的Controller,我们int通过UI传递,代表Product数据库中的一个.以下哪两个例子是正确的(如果它们都错了,请告诉我)?

示例一:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Controller实例化产品本身并通过以下方法添加它:

void AddProduct(Product product)
{
    productList.Add(product);
}
Run Code Online (Sandbox Code Playgroud)

示例二:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Order域模型传递给它注入的产品库,并且它得到的产品,并增加了它:

Product AddProduct(int productId, IProductRepository productRepository)
{
    Product product = productRepository.GetProduct(productId);
    productList.Add(product);

    return product;
}
Run Code Online (Sandbox Code Playgroud)

我目前已经去了第一个例子,因为你的域模型不应该在内部调用服务方法,但是我最近看到了一些使用我的第二个例子的例子,它确实看起来很整洁.在我看来,示例一正在接近贫血.示例二会将所有产品添加逻辑移动到域模型本身.

Ali*_*tad 2

第二个太可怕了...

添加产品到订单中不应在其签名上包含存储库,因为存储库不是域的一部分。

我倾向于选择第一个。