过去两周我一直在研究DDD,其中一个真正让我感到困惑的事情是聚合根可以包含其他聚合根。从存储库中检索聚合根,但如果根包含另一个根,那么存储库是否有对另一个存储库的引用并要求它构建子根?
答案 0 :(得分:2)
@Paco:你错了。存储库不仅用于存储对象。如果您已经阅读过Eric Evan的DDD书籍,那么您就会知道存储库就像是面向对象的内存中数据表示。您可以像使用Collection一样使用Repository对象。您可以使用索引器来获取或设置对象,您可以使用Add()方法添加新对象,您可以使用Remove()方法删除对象等。
然后,存储库使用基础结构从/向数据库读取/写入数据。它可以使用DataMapper简化从关系数据库中检索数据并映射到您的实体。
答案 1 :(得分:1)
存储库不会构建,但会存储。使用ddd时,您可能希望熟悉基本持久性模式,如工作单元,身份映射,延迟加载,对象关系映射器,查询对象,(动态)代理。 (这些模式与ddd无关,但知道非常有用)。存储库只是一个隐藏前面提到的模式的实现的外观,并以域驱动的方式抽象dataaccess。大多数人现在不手动手动编写持久性基础结构,特别是在使用ddd时,您可能希望查看一个orm。
将数据库记录转换为对象的代码的实际引用将在datamapper中。映射类本身中的映射类之间会有引用,或者像mapperfactory之类的东西一样。
public interface IDataMapper<T>
{
T Map(IDataReader reader);
}
您不必自己实现此代码,只需使用为您执行此操作的工具,并尝试了解工具(orm)中的部分代码是如何工作的。如果没有一套好的工具可以避免编写大量代码,那么没有任何orm的纯ddd几乎是不可能的。
答案 2 :(得分:0)
从我的观点来看,它取决于 - 我有相同的场景,我处理这个问题的方式是通过我正在使用的ORM - nHibernate。
我有所有实体的映射,其中有几个是聚合根,其中一个有其他几个聚合根作为成员变量。此复合聚合根的存储库不需要引用其他聚合根存储库,因为nHibernate知道如何获取所需的所有数据(通过映射)。
HTH
AWC