我一直在努力寻找合适的设计,以避免从实体中引用存储库。假设我拥有经典的Customer
和Order
类,如下所示:
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/