【发布时间】:2021-07-05 21:51:05
【问题描述】:
短版
如果没有聚合会凭空出现并且至少会导致业务建模出现错误,为什么我们还需要 DDD 中的工厂(被注入应用层)?
加长版
有一个流行的 DDD 示例,它是由以下聚合和实体组成的电子商务应用程序(过于简化)
建模为
class Customer {
private CustomerId id;
// related business rules and processes
}
class Order{
private OrderId id;
private List<OrderLine> orderLines;
// related business rules and processes
}
class OrderLine{
private OrderLineId id;
private int quantity;
private ProductId product;
// related business rules and processes
}
class Product{}
// etc...
众所周知,订单的创建是通过工厂完成的,通常像:
Order order = orderFactory.createNewOrder(customer);
但是我认为这个模型不是很清楚,因为我假设原始(组成)要求是
客户可以下订单。
那么将订单的创建委托给Customer 聚合并让代码更冗长不是更有意义吗?即:
Order order = customer.placeOrder(...);
// Pass the data needed for the creation of the object, or even the factory service if the creation is complex
在我看来,扩展这个视图会导致系统的参与者大部分时间都是聚合的,它们将包含用例的所有调用(其中有效果是应用层也很薄)
第二种方法是否违反 DDD ?负责创建另一个聚合的聚合感觉不对,但会生成更好的代码,在我看来,与域更好地匹配。
【问题讨论】:
-
使用
customer.placeOrder(...),您将把这个责任交给Customer类。这是您的应用程序需要的吗?归根结底,这取决于您的 要求。但对我来说,这听起来会让Customer类承担太多责任。 -
Customer确实有很多责任,因为所有用例都将由它(和其他参与者类)调用。但是,如果我们整合有界上下文的概念并引发适当的领域事件,这些方法应该会变得越来越瘦 IMO。
标签: java oop architecture domain-driven-design factory