我以前认为我的Domain对象不应该在其方法中包含存储库调用。但是我遇到了以下问题。
我知道域对象必须始终处于集成状态。
例如,如果您有没有订单行的订单不能存在的规则,您需要在订单构造函数中添加orderLine并使LineOrder集合只读。
在我的情况下,如果订单移至Approved状态,我需要检查客户是否有足够的资金来订购,以及应用程序是否可以为该客户进行转账,然后将转移转移到订单。所以我的order.Approve方法需要调用相应的存储库方法来检查是否可以批准订单并获得所需的导航属性(订单 - 传输关联)。
如果我没有在批准方法中进行此检查和分配并在OrderService类中创建批准方法(因为批准可能被视为进程),那么我的批准方法可能会导致对象无法集成状态,如果有人在其他方面调用它代码部分。
所以我的问题是:
1.如果在域对象方法中使用存储库是不对的,那么如何解决上面对象的完整性问题呢?
2.如果批准不是流程,那么客户的流程是什么,订单样本? :)
答案 0 :(得分:3)
也许您应该考虑到单个实体可以有多个验证上下文。
您问题的答案: 1)您不应在域模型中使用存储库。 2)批准似乎更像是与服务相关的问题,与您的订单无关。
答案 1 :(得分:0)
NHibernate和EntitiFramework通过延迟加载(按需)所需的子项来解决这个问题。
实施例
foreach(var transfer in myOrder.Customer.Transfers)
通过访问myOrder.Customer
,客户对象从数据库加载。
通过访问myOrder.Customer.Transfers
,从数据库加载了转移集合。
这样就无需访问存储库。
以下是一个示例,说明如何消除对业务方法中存储库的需求:how-to-create-fully-encapsulated-domain-models。