Domain driven design DDD:获取其他聚合的聚合根

Domain driven design DDD:获取其他聚合的聚合根,domain-driven-design,repository-pattern,aggregateroot,Domain Driven Design,Repository Pattern,Aggregateroot,在过去的两周里,我一直在研究DDD,其中一件真正让我印象深刻的事情是聚合根如何包含其他聚合根。聚合根是从存储库中检索的,但是如果一个根包含另一个根,那么存储库是否有对另一个存储库的引用,并要求它构建子库?依我看,这取决于-我有相同的场景,它们是通过我正在使用的ORM处理的-nHibernate 我的所有实体都有映射,其中几个是聚合根,其中一个有几个其他聚合根作为成员变量。此复合聚合根的存储库不需要引用其他聚合根存储库,因为nHibernate知道如何获取所需的所有数据(通过映射) 嗯 AWC存储

在过去的两周里,我一直在研究DDD,其中一件真正让我印象深刻的事情是聚合根如何包含其他聚合根。聚合根是从存储库中检索的,但是如果一个根包含另一个根,那么存储库是否有对另一个存储库的引用,并要求它构建子库?

依我看,这取决于-我有相同的场景,它们是通过我正在使用的ORM处理的-nHibernate

我的所有实体都有映射,其中几个是聚合根,其中一个有几个其他聚合根作为成员变量。此复合聚合根的存储库不需要引用其他聚合根存储库,因为nHibernate知道如何获取所需的所有数据(通过映射)


AWC

存储库不构建,但存储。使用ddd时,您可能希望熟悉基本的持久性模式,如工作单元、标识映射、延迟加载、对象关系映射器、查询对象、(动态)代理。(这些模式与ddd无关,但了解它们非常有用)。存储库只是一个门面,用于隐藏前面提到的模式的实现,并以域驱动的方式抽象数据访问。现在大多数人都不会手动编写持久性基础结构,特别是在使用ddd时,您可能想看看orm

将数据库记录转换为对象的代码的实际引用将在datamapper中。MappingClass本身或由mapperfactory之类的东西创建的MappingClass之间会有引用

public interface IDataMapper<T>
{
   T Map(IDataReader reader);
}
公共接口IDataMapper
{
T图(IDataReader阅读器);
}

您不必自己实现此代码,只需使用一个为您实现此代码的工具,并尝试了解工具(orm)中的部分代码是如何工作的。没有orm的纯ddd几乎是不可能的,因为没有一套好的工具可以让你避免编写大量代码。

@Paco:你错了。存储库不仅仅用于存储对象。如果你读过Eric Evan的DDD书,你就会知道存储库就像是数据的面向对象内存表示。使用存储库对象的方式与使用集合的方式相同。可以使用indexer获取或设置对象,可以使用Add()方法添加新对象,可以使用Remove()方法删除对象,等等


然后,存储库使用基础结构从数据库读/写数据。它可以使用数据映射器简化从关系数据库检索数据并映射到实体的过程

是领域驱动设计吗?你看过复合设计模式了吗?