如何在java或c#中强制执行ddd聚合?

时间:2015-09-05 20:00:20

标签: java c# domain-driven-design

Evans写道,聚合的概念使得不是根的聚合的所有对象都不能被任何其他对象引用,而这些对象不是聚合根。 有没有合理的方法可以在Java或C#中强制执行此操作。也就是说,如果我在代码库中引入聚合,我是否可以确保将来对DDD不感兴趣的开发人员不会直接从聚合外部创建子部分的引用?或者至少让他/她难以做到这一点?

2 个答案:

答案 0 :(得分:2)

我想不出任何方式不会过度限制您的实体的可用性或增加超过收益的复杂性。您应该记住,对非根实体进行临时(临时)引用是合法的,并且在某些情况下可能很有用,因此基于范围的静态限制实际上不是一种选择。

当谈到高级设计原则时,我倾向于依赖团队文化和开发人员指导而不是防御性编程,因为后者通常会以某种方式适得其反,你最终会得到丑陋的过于复杂的代码以允许异常你自己设定的僵硬障碍。 “架构”框架属于同一类别 - 对于简单的应用程序来说简单而有效,但是当您开始添加例外情况时,它们很快就会成为一种负担,而不仅仅是一种帮助。

答案 1 :(得分:0)

要确保无法从外部访问Aggregate的内容,您必须仅通过其根目录撰写(添加内容)。您必须存储从外部提供的内容的深层副本,以避免存储已引用的对象。换句话说,您只能存储由root本身创建的对象。这同样适用于将Aggregate内容返回到外部世界 - 根必须只返回存储对象的深层副本,从而保护它们不被引用。

由于我们讨论了引用,因此复制不可变对象也是有意义的,从而控制它们何时符合垃圾收集(Java)的条件。

希望这有帮助。