好问题。前几天我也在想他们。
实际上,试试 NHibernate 3.0 alpha(或当前的主干),它的新 LINQ 提供程序比以前的提供程序要大得多。(到目前为止,我只发现了一种不起作用的方法,但是如果您遇到默认情况下不支持的东西,可以使用您自己的机制。)使用当前的主干我没有问题(还没有?) . 您可以在http://www.hornget.net/packages/站点上找到“夜间”构建,以及针对它的 FluentNHibernate 构建。如果您知道如何使用 Fluent,它确实会提高您的工作效率。SO 社区也确实帮助了我。
如果您对直接依赖于 NHibernate 的业务层感到满意,或者您正在编写一个较小的应用程序,该应用程序在没有这种抽象的情况下仍可维护,那么您最好不要使用存储库模式。但是,如果你做得对,它可以为你节省大量的冗余编码。
抽象它的原因不仅是因为您可以稍后用另一个 ORM 替换 NHibernate,而且由于一个名为Separation of Concerns的概念,这是一个很好的实践。您的业务逻辑层不应该关心或知道如何访问它所使用的数据。这使得维护应用程序或其不同层更容易,这也使团队合作更容易:如果 X 创建数据访问层,Y 编写业务逻辑,他们不必详细了解彼此的工作。
公开 anIQueryable<T>
是一个非常好的主意,这正是许多存储库实现现在正在做的事情。(我也是,虽然我更喜欢在静态类中编写它。)当然,如果您愿意,您必须公开一些插入或更新实体的方法,或者用于开始和提交事务的方法。(BeginTransaction 应该只返回一个IDisposable
以避免泄漏 NHibernate 接口,这样就可以了。)
我可以给你一些指导:查看 SharpArchitecture 或 FubuMVC Contrib 的实现,以获得一些关于如何正确操作的想法,这就是我解决它的方法。