存储库模式与"智能"业务对象

mar*_*c_s 57 architecture repository-pattern data-structures

在.NET(Winforms,WPF,ASP.NET)上创建更大规模的企业级应用程序时,我看到两个主要的"思想流派".

有些人使用"存储库模式",它使用知道如何获取,插入,更新和删除对象的存储库.这些对象相当"愚蠢",因为它们不一定包含大量逻辑 - 例如,它们或多或少是数据传输对象.

另一个阵营使用我所谓的"智能"业务对象,它们知道如何加载自己,并且它们通常具有Save(),可能是Update()甚至Delete()方法.在这里,你真的不需要任何存储库 - 对象本身知道如何加载和保存自己.

最大的问题是:你使用或更喜欢哪种?为什么?

您是否在所有应用中使用相同的方法,或者您在选择一种方法时是否有任何特定标准?如果是的话 - 这些标准是什么?

我不是想在这里开始一场火焰战 - 只是试图找出每个人对此的看法以及你的观点是什么,以及为什么你使用一种(或两种)模式而不是另一种.

感谢任何建设性的意见!

Joh*_*ing 39

由于单一责任原则,我使用存储库模式.我不希望每个单独的对象必须知道如何保存,更新,删除自己,这可以由一个单一的通用存储库来处理

  • 我也喜欢存储库样式,因为数据传输对象更灵活.你可以在任何地方使用它们,不依赖于框架,层等.它们只代表概念,即模型.如果您想在模型和BD之间建立桥梁,则需要构建持久层.您希望在模型和构建UI的用户之间建立桥梁.您想要计算事物,实现用例,构建业务逻辑.所有这些都只涉及模型对象,这些对象除了业务概念本身之外并没有附加. (4认同)
  • 在这种情况下,一个通用存储库然后需要知道如何加载所有类型的对象. (3认同)

thi*_*ing 16

存储库模式不一定会导致愚蠢的对象.如果对象在Save/Update之外没有逻辑,那么你可能在对象之外做了太多.

理想情况下,您永远不应该使用属性从对象获取数据,计算内容并将数据放回对象中.这是封装的突破.

因此,除非您将简单的DTO对象与CRUD操作一起使用,否则对象不应该是贫血的.

然后将持久性问题与对象关注点分开是一种获得单一责任的好方法.


ash*_*raf 7

这是我遇到的两篇有趣的文章

存储库是最新单

DAL应该一直到用户界面