我正在使用域驱动设计和测试驱动开发来开展项目。在阅读Evans的DDD书籍时,我注意到他没有为域中的聚合根定义接口。
如果我同时执行DDD和TDD,我应该为每个聚合根定义接口,以使聚合根类易于测试和模拟吗?如果是这样,我是否还应该为聚合根中包含的每个实体定义接口?
通过我在Google和StackOverflow上的搜索,我找到了接近我正在寻找的答案,但我在做DDD和TDD时都特别寻求建议,因为我的假设在进行TDD时,可测试性可能在我迄今为止看到的答案中被忽略了。
答案 0 :(得分:5)
不,直接针对聚合进行测试。聚合本身不应该注入依赖项,如果特定行为需要依赖项,通常应该表示为接口。聚合上的接口是一种不必要的抽象 - 只有一种行为实现 - 这就是重点。另外,看看BDD and DDD - 行为驱动开发可以看作是TDD的演变,并与DDD很好地对齐。
答案 1 :(得分:3)
我习惯定义interfaces for all entities and domain services以简化使用域的客户端的测试。此外,这种方法可以在需要时简化AOP。
对于价值对象,它取决于。例如,我不使用接口用于事件参数,identifiers,exceptions(显然)和其他一些“契约”。但是,我不得不介绍接口以简化客户端代码测试的隔离。因此,我的经验法则是:客户端需要多少步才能使值对象处于所需状态?如果它不止一个(或两个,好感是我的朋友:-D),我从一开始就介绍一个界面。
注意我不是在谈论聚合,因为我的所有聚合也都是实体。