在我们的 DDD 项目中,我们使用工厂来创建我们的初始聚合根模型“订单”。有一条业务规则规定,新订单的供应商“Order.Supplier”默认为特定供应商。我们需要从数据库中获取默认供应商。
在创建初始订单时是否可以调用Order工厂中的供应商存储库以获取默认值?我知道工厂的目的是在有效状态下创建模型。有效的新状态需要设置默认值。在这种情况下,我可以调用存储库还是应该将默认供应商传递给工厂构造函数?
在我们的 DDD 项目中,我们使用工厂来创建我们的初始聚合根模型“订单”。有一条业务规则规定,新订单的供应商“Order.Supplier”默认为特定供应商。我们需要从数据库中获取默认供应商。
在创建初始订单时是否可以调用Order工厂中的供应商存储库以获取默认值?我知道工厂的目的是在有效状态下创建模型。有效的新状态需要设置默认值。在这种情况下,我可以调用存储库还是应该将默认供应商传递给工厂构造函数?
+1 关于 Factory OR a DomainService 可以访问存储库的事实。
但
-1 上:
我认为这与域根本无关。我认为这是一个应用程序规则。
跟我一起想一想:如果企业现在决定默认供应商是另一个供应商怎么办?这是一个需要改变你的业务的规则吗?这需要改变你的工厂吗?可以吗?
请记住:域指向“我们从事哪些业务”,而不是“我们如何开展业务”。
我宁愿把它放在 ApplicationService 上。域不需要知道是否有默认供应商。无论如何,它可能需要一个“供应商”。
Order 可能有一个构造函数,比如 Order(Supplier supplier) - > 这将强制一个订单有一个供应商。
或者,工厂可能会在其方法中收到 DefaultSupplierId。
但是域永远不应该知道它。在我看来,它不适合那里。
布鲁诺
您的问题的简单答案是,是的。
它可以,并且有一个非常特殊的情况,工厂需要调用存储库。当 ORM 生成聚合身份时(例如NHibernate HiLo),存储库将公开一个类似的方法
class SomeRepository {
...
Identity Generate();
...
}
如果聚合结构足够复杂,值得一个专门的工厂,那么从工厂调用“生成”是很自然的。