为什么NHibernate需要存储库模式?


13

我正在阅读您的第一个基于NHibernate的正式应用程序

尽管本教程很好且易于遵循,但我想知道为什么使用存储库模式。

在不同的AddUpdateRemove在方法ProductRepository的实现,代码是几乎相同的-他们使用的所有交易,不同的是在“肉”,即调用session.SaveINT的Add方法,session.Deleteremove方法。(页面缺少HTML锚,但你可以搜索页面像相关的代码public void Removepublic void Add

该代码只是“感到错误”。

作者为什么使用Repository模式-仅仅是为了演示使用NHibernate还是出于某些原因?

附言 我的背景是使用ActiveRecord的Ruby on Rails,所以我试图弄清NHibernate的工作方式/使用方式。


1
如果您喜欢ACtive Record模式,则可以使用城堡Active Record来坐在NHibernate castleproject.org/activerecord的
Ben Robinson

3
这是一个关键问题。关于是否使用它有一些争论。Ayende撰写了他的论点,认为不使用Repository是新的Singleton

Answers:


10

不需要存储库模式。至于所有其他模式,则是您必须针对业务需求做出的“建筑”决策。通常,存储库模式用于实现“实体持久性”,这意味着您的实体对如何将自己持久存储在存储设备(数据库,XML,TextFile等)一无所知。例如,如果您有一个实体地址,它将不包含持久性逻辑(您不会在任何地方找到诸如address.Save或address.Update之类的东西),但是您会将您的实体传递给负责持久化变化


我认为是和不是。NHibernate会话本身就是soem的通用存储库。因此,添加额外的存储库通常只不过是向会话对象添加外观。

实际上,我的答案开始时就像“不需要存储库模式...”,这仅仅是针对业务需求的架构决策

我完全同意这一点。但是我没有想到会话本身就是一个存储库,仅此而已。

9

使用存储库模式的优点是模拟了数据访问层,因此您可以在不调用DAL代码的情况下测试业务层代码。还有其他很大的优势,但这对我来说至关重要。


2
+1 ActiveRecord模式使隔离DAL进行模拟非常困难,通常以需要使用自己的数据库的单元测试结束(在这种情况下,单元测试成为集成测试)。
MattDavey 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.