回答

2

我想这取决于你将如何依靠他们。

问题是 - 你是否会允许自己从域内使用存储库?
如果是这样 - 那么你被迫把它们放进去。

我自己喜欢把它们放在域外。所以 - 典型的生命周期看起来像这样=>

UI => Controller =>通过聚合根检索聚合根=>通过聚合根=>调用逻辑如果创建新聚合根,将其添加到回购。

有时候控制器会调用应用程序服务,除了检索root和调用函数之外,它还会执行一些额外的工作。但想法是一样的 - 域名对持久性一无所知。


虽然(在我看来)没有什么错把回购域(或至少其中的抽象),它使您的域名更清楚的持久性。有时候,这可以解决问题,但通常情况下 - 这肯定会使您的域更加复杂。

使用看起来更自然的东西,随时准备好切换你的方式。

+0

我会说这取决于我们是否需要分层架构与否;如果我们这样做,那么就没有选择:存储库进入领域层。 – 2015-04-09 20:59:04

14

存储库接口是域的一部分。接口的实际实现应该是基础结构的一部分。

+0

好吧。这些接口是域的一部分,因为它定义了DO可以访问的合同。它经常被忽视。 – 2010-09-03 11:50:12

+0

定义分层架构的规则如何(请参阅我的答案)? – 2015-04-09 20:57:54

+1

优秀的问题。存储库接口是在域层和基础结构层之间共享的数据定义模块中定义的。它意味着一种轻松分层的形式。正如“软件体系结构模式”一书中所述, 39:»J层提供的函数的参数,返回和错误类型应该是编程语言的内置类型,层J中定义的类型或从共享数据定义模块中获取的类型。请注意,层之间共享的模块放宽了严格分层的原则。« – 2015-04-11 05:34:36

4

存储库实现类以及单独的接口(如果存在的话)应该进入域层

原因是分层体系结构遵循的基本原则:下层不能依赖更高层

如果我们接受这个规则(否则它不是分层架构),那么将存储库实现放入基础架构层会使其依赖于域层,因此违反了分层的基本规则。

例如,当我们创建一个新的域实体时,我们把它放在域图层中;并且由于存储库(其接口及其实现)必然依赖于域实体,这意味着存储库也必须进入领域层。否则,只要在域图层中添加/删除/修改域实体,我们就会更改基础架构层。

其他问题(如保持域层“干净”且独立于持久性细节)可以并且应该通过使用域层内实现的适当基础设施服务来实现。例如,在Java中,我们可以使用JPA以很少的代码实现存储库,并且不需要SQL/JDBC或特定于数据库的代码(使用JPA实现存储库是否是一个好主意是另一个讨论;无论如何,JPA实体将反正使用JPA注释)。

参考文献:WikipediaMSDN