存储库实现是我的域模型的一部分,还是我应该仅将它们的抽象作为我的域的一部分?
我应该在存储库上放置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] 删除。
我来说两句