【发布时间】:2015-02-22 13:47:09
【问题描述】:
聚合必须设计为事务性和最终一致性。这种围绕实体的一致性边界有助于管理复杂性。
在我们的存储库实现中,我们使用实体框架与实际数据库进行交互。从历史上看,我们总是有巨大的上下文(跨越数十个表),它们代表数据库中(或至少在数据库的某些功能区域)中的每个可用表、字段和关系。这里的问题是,这个上下文被用于数百种不同的事情,并且随着系统变得越来越大而呈指数增长,导致一些事情变得非常难以维护。
限界上下文划分
因此,通常建议为系统中的每个有界上下文创建单独的 DbContext。 Julie Lerman 在她的文章Shrink EF Models with DDD Bounded Contexts 中提出了这一点。
按总量划分
如果我们的聚合在事务上是一致的,那么是什么阻止我们更进一步并创建专用上下文来为每个聚合存储库提供服务?
它不会混杂(满足每个人的需求),而是会给出上下文明确的意图。
仅当聚合需要更改时,上下文才需要更改。它随着聚合而发展。对于更大的上下文,系统的许多部分可能依赖于上下文的一部分。一个单一的变化可能会危及很多。
只有聚合所需的表、字段和关系需要存在于上下文中。通常在处理更大的上下文时,您不会为给定表上的大多数关系或字段而烦恼。
这种方法有一些缺点。即:
尽管它们的建模方式可能不同(取决于它们的用途),但某些数据库表和关系可能需要存在于多个上下文中。
如果使用,代码优先迁移会很棘手。
这可能被视为过度设计。
任何人都可以提供有关此方法的进一步见解吗? 是否有一些我忽略了的东西?
编辑:
请注意,我们没有在我们的域中使用 EF 数据实体。我们的存储库从这些数据实体中实例化并合成更丰富的域模型。
【问题讨论】:
-
我认为强制有界上下文只包含一个聚合是违反 DDD 的,因为域服务于特定的业务任务/区域,这可能涉及多个聚合。我看到它可能有一些好处(正如你所提到的),但这些好处的代价太大而不能违反 DDD 原则。
标签: domain-driven-design ddd-repositories