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

当涉及到在.NET上创build更大规模的企业范围应用程序(Winforms,WPF,ASP.NET)时,我看到两个主要的“思想stream派”。

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

另一个阵营使用我称之为“聪明”的业务对象,知道如何加载自己,他们通常有一个Save(),可能是Update()甚至Delete()方法。 在这里,你真的不需要任何库 – 对象本身知道如何加载和保存自己。

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

你在所有的应用程序中使用相同的方法,或者你有什么特别的标准来select一种方法吗? 如果是这样 – 这些标准是什么?

我并不是试图在这里开始一场火焰战争 – 试图找出每个人对此的看法,你的看法是什么,以及为什么你使用一种(或两种)模式。

感谢您的任何build设性意见!

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

存储库模式不需要导致愚蠢的对象。 如果对象在保存/更新之外没有任何逻辑,那么您可能在对象之外做了太多的事情。

理想情况下,您绝对不应该使用属性从对象中获取数据,计算东西并将数据放回对象中。 这是封装的一个突破。

所以对象不应该是贫血,除非你使用CRUD操作简单的DTO对象。

然后将持久性问题从您的对象关注点分离出来是一个单一责任的好方法。

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

存储库是最新单

DAL应该一路走到用户界面

我认为使用Repository模式与ActiveRecord模式最重要的副作用是testing和可扩展性。

没有你的ActiveRecord对象包含一个存储库本身,你将如何隔离testing用例中的数据检索? 你不能真的伪造或嘲笑它。

除了testing之外,更换数据访问技术也是非常困难的,例如从Linq到SQL到NHibernate或者EntityFramework(尽pipe这不会经常发生)。

这实际上取决于应用程序的需求,但是在处理复杂的业务模型时,我更喜欢ActiveRecord。 我可以在一个地方封装(和testing)业务逻辑。

大多数ORM(EF,nHibernate等等)作为你的版本库。 许多人认为ORM之上的一个层将所有数据交互封装为一个Repository,我认为这是错误的。 根据Martin Fowler的说法,一个Repository将数据访问作为一个集合进行封装。 所以对于所有的数据检索/变异有单独的方法可能是使用数据映射器或数据访问对象。

使用ActiveRecord,我喜欢有一个“实体”基类。 我通常对这个基类使用ORM(存储库),所以我所有的实体都有一个GetById,AsQueryable,Save和Delete方法。

如果我使用更多的面向服务的体系结构,我将使用一个存储库(一个掩盖直接数据访问 ORM)的存储库,并直接在我的服务中调用它。