例如,获取订单实体。很明显,没有订单就不存在订单行。所以我们必须在OrderRepository的帮助下获取它们(抛出一个订单实体)。好。但是,与订单松散耦合的其他事情呢?客户信息是否仅可从CustomerRepo获得,以及BankRequisitesRepo等提供的卖方银行必需品?如果它是正确的,我们应该将所有这些存储库传递给我认为的Create Factory方法。
答案 0 :(得分:0)
是。通常,每个主要实体(域驱动设计术语中的聚合根)都应该有自己的存储库。子实体*与订单行一样)通常不需要一个。
是的。将每个存储库定义为服务,然后在需要的地方注入它们。
您甚至可以根据实际的数据库链接设计订单和客户之间没有直接耦合的东西。这反过来又允许客户和订单生活在完全独立的数据库中。哪些对您的应用程序可能有用,也可能没用。
答案 1 :(得分:0)
您正确理解聚合根(AR)子实体不应拥有自己的存储库,除非它们本身就是AR。拥有非AR的存储库会使您的不变量不受保护。
但是,您还必须了解实体通常不应该为了方便而聚集在一起,或者只是因为业务声明某个实体有一个或多个某个其他实体。 / p>
我强烈建议您阅读Vaughn Vernon撰写的Effective Aggregate Design以及Vaughn为我提出的问题写的其他blog post。
有效聚合设计中指出的一个总体设计经验法则是,您通常应该仅通过身份引用其他聚合。
因此,您可以大大减少其他AR创建过程中所需的AR实例数量,因为new Order(customer, ...)
可能会成为new Order(customerId, ...)
。
如果你仍然觉得需要在一个AR的创建过程中查询其他AR,那么将存储库注入依赖关系并没有错,但你不应该依赖于你需要(例如,让客户端解析真正的依赖关系并直接传递它们,而不是传递允许解决依赖关系的策略)。