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