存储库实现是我网域的一部分吗?存储库应该有SQL查询吗?

里奥·卡瓦尔坎特

存储库实现是我的域模型的一部分,还是我应该仅将它们的抽象作为我的域的一部分?

我应该在存储库上放置SQL查询还是将它们放在另一种模式中并作为存储库的依赖关系传递?

谢谢

更新资料 插图

更新2请看一下:http : //leocavalcante.github.io/patterns/2014/07/11/repository-pattern-and-database-schema.html

阿德里安·汤普森·菲利普斯

如果您使用的是六角形,洋葱形或端口和适配器样式的体系结构,那么通常的做法是将存储库接口放入域模型中,将存储库实现放入持久性层/适配器中。然后,您将使用IoC容器将它们连接起来,并将持久层中的引用添加到域模型中。这使您可以在持久层中使用域模型实体和值对象,还可以通过IoC访问域模型中的存储库。

SQL的位置取决于您,这并不是DDD的事情,但这可能属于您的存储库。标准做法是使用存储过程或LINQ样式查询,并使用诸如实体框架或NHibernate之类的ORM。在后一种情况下,查询将存在于存储库中。

优良作法是您的存储库接受域实体(即用于创建/更新)并返回域实体(即用于查询)。ORM生成的任何自动生成的实体通常都会被您的存储库隐藏。这似乎可以消除您从ORM获得的许多“好处”(例如延迟加载和2向导航属性),但是这些事情通常会妨碍良好的DDD以及特别好的对象/实体设计。

额外细节

存储库模式的目标是“像列表一样工作”,以隐藏持久性细节。因此,设计存储库的目的是使其成为一个简单的集合,可以在其中添加,删除和更改项目。在后台,您的存储库可以(应该)知道它在哪里存储数据,即SQL数据库,平面文件,XML文件等。

在DDD中,理想情况下,每个聚合根需要一个存储库。例如,持久保留单个Customer聚合根(聚合根可以是单个实体,也可以由其他实体或值对象组成的实体)可能导致写入4个单独的表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

动态链接程序是Linux系统上内核或GCC库的一部分吗?

如何在JPA存储库方法中使用组合键的一部分?

如何将git config存储为存储库的一部分?

分叉GitHub上存储库的子目录,并将其作为我自己的仓库的一部分

带有Android的Bitbucket:“无法发布存储库的一部分”错误

Git-仅克隆存储库的一部分,并仅获取该部分的请求?

这些TLOG文件是什么?这些应该成为我的源代码管理的一部分吗?

nuget .props和.targets文件是否应该成为源代码存储库的一部分?

我应该有多个存储库吗?

我应该将存储库接口与域模型分离吗

有没有办法存储我的存储库的一部分以进行部署并能够进行git pull

在Azure DevOps上仅将TFS存储库的一部分迁移到Git

我可以引用C位域的另一部分吗?

如何仅更新字段的一部分并更新存储库?

VS Code-git存储库中有太多活动更改,将仅启用一部分Git功能

作为IntelliJ项目打开Github存储库的一部分

如何为GitHub存储库中的一部分代码着色?

将一部分存储库导入为lib

SQLCMD是数据库引擎或客户端工具的一部分吗?

可以安装不是官方存储库一部分的.deb软件包,从而导致软件包依赖性问题吗?

Git提交对存储库一部分的访问权限

我是僵尸网络的一部分吗?

Mercurial(hg)将存储库的一部分复制到另一个存储库

android支持库是android框架API的一部分吗?

跳过一个文件,但仍然是存储库的一部分

如何将存储库的一部分复制到Artifactory?

我应该有一个 ViewModel 类为每个 Model 类实现 INotifyPropertyChanged 吗?

将更改推送到 GitHub 存储库作为 Azure DevOps 中发布管道的一部分

使用 CMake 仅构建 git 子模块存储库的一部分