我一直在努力寻找合适的设计,以避免从实体中引用存储库。假设我拥有经典的CustomerOrder类,如下所示:

public class Customer {
    ...
    public IEnumerable<Order> Orders { get; set; }
}

public class Order {
    ...
    public Customer Customer { get; set; }
    public IEnumerable<OrderItem> OrderItems { get; set; }

    public void Submit() {
       ...
    }
}

public class OrderItem {
    public Product Product { get; set; }
    public decimal SellingPrice { get; set; }
}


现在,假设产品的售价出于某种原因取决于以下事实:该产品也是在前一个订单中购买(或未购买),当前订单和前一个订单上的商品数量等。我可以这样做:

public void Submit() {
    Order lastOrder = this.Customer.Orders.LastOrDefault();
    CalculatePrice(lastOrder);


但这会在我只需要最后一个订单时加载整个订单列表!

我想做的是这样的:

public void Submit() {
    Order lastOrder = _orderRepository.GetLastOrderFor(Customer);
    CalculatePrice(lastOrder);


但是我知道在域中引用OrderRepository是错误的DDD。那么,我该怎么办?我是否必须将Submit()放在域之外的其他位置?如果是这样,您在哪里建议?

最佳答案

您有两种:

创建一个域服务,并从中向存储库添加依赖项:

public class MyPricingStrategy : IPricingStrategy
{
  public MyPricingStrategy(IOrderRepository repository)
  { ... }
}


这样,您将创建域服务引用存储库,这不是一个坏主意。

另一个选择是使定价策略成为域对象,应用程序层将其从存储库传递所需的数据:

public class LastOrderPricingStrategy
{
  public LastOrderPricingStrategy(Order lastOrder)
  { ... }
}


在应用层

var lastOrder = orderRepository.GetLastOrder(currentCustomer);
var pricingStrategy = new LastOrderPricingStrategy(lastOrder);

关于domain-driven-design - 如何在DDD中执行此操作而不从域实体引用存储库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7906923/

10-13 09:07
查看更多