【问题标题】:Using nHibernate and the repository pattern, need some direction使用 nHibernate 和存储库模式,需要一些指导
【发布时间】:2010-11-20 18:32:00
【问题描述】:

好的,我刚刚进入 nhibernate(使用流利的)。

我喜欢它的一件事是我可以使用存储库模式(从 nhibernate rhino 博客中了解它)。

基本上使用泛型,我可以创建适用于我所有数据库表的方法。

 public interface IRepository<T>
    {
        T GetById(int id);
        ICollection<T> FindAll();
        void Add(T entity);
        void Remove(T entity);
    }


 public class Repository<T> : IRepository<T>
    {

        public ISession Session
        {
            get 
            { 
                return SessionProvider.GetSession(); 
            }
        }


        public T GetById(int id)
        {
            return Session.Get<T>(id);
        }

        public ICollection<T> FindAll()
        {
            return Session.CreateCriteria(typeof(T)).List<T>();
        }

        public void Add(T t)
        {
            Session.Save(t);
        }

        public void Remove(T t)
        {
            Session.Delete(t);
        }    

    }

然后我继承 Repository 类,然后我可以添加特定于该实体的方法。

在尝试添加更新方法时,有人提到存储库模式应该作用于集合?我在这里看东西不正确吗?为什么我不能创建更新方法?

我尝试添加更新方法,但我对如何处理会话和更新数据库感到困惑?

我希望每个实体的所有数据库访问都在一个地方,因此 UserRepository 将拥有所有基本的 CRUD,然后可能还有其他一些方法,例如 GetUserByEmail() 等。

【问题讨论】:

    标签: nhibernate fluent-nhibernate repository-pattern


    【解决方案1】:

    不要使用存储库模式 - 改用 UnitOfWork 模式,并将定义的查询 ICriteria 传递给 ISession。本质上,回购模式是在包装不需要用 NH 包装的东西。

    查看http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx了解更多信息

    【讨论】:

    • 我认为暗示工作单元和存储库模式是可以互换的,因为它们解决了不同的问题,这是一种误导。我对 Ayende 的那篇帖子很熟悉,虽然我认为它肯定有一些道理,但请记住,这只是一种观点,不应作为事实呈现。
    • ight,但是如果您正在学习 NH,那么从存储库模式开始(每次调用 repo.Update() 时都会刷新)是一个坏习惯。或者,您最终可以编写一些奇怪的 Repo 和 UoW 混合体,看起来像一个 Repo,但仍需要刷新,或者错过了断开连接的 UoW 的伟大之处。在我看来,宅基地已经学习了一些教程,正在迈出他的第一步,并为他需要的东西走错了路,以及学习 NH 的最佳方法是什么。
    • 但是,是的,你是对的,我让它听起来像是一个笼统的声明。回购模式在适当的情况下很有用。我应该说“IMO 在这种情况下,回购模式正在包装一些东西......”
    • 每次调用你的仓库时刷新是个坏主意。这就是为什么我说这两种模式解决了不同的问题。存储库充当架构接缝,清楚地表明您的应用程序在何处以及如何检索和插入实体,而 ISession 是您进行更改跟踪的工作单元。恕我直言,您应该再看看存储库模式,例如在 S#arp 架构中使用的模式 - 因为您所拥有的图片(由存储库处理刷新)是一个非常糟糕的实现。
    • 据我所知,存储库模式让您可以将数据存储视为内存中的对象列表(来自 martinfowler.com/eaaCatalog/repository.html/...“。对象可以可以添加到存储库中或从存储库中删除,就像它们可以从简单的对象集合中一样”)。一个简单的对象集合,如果从另一个会话访问,将立即反映更改,因此 Repo 应该刷新。同样,这只是我根据 Fowler/DDD 书对存储库定义的解释,但它们都没有提到刷新。 IMO Repo 需要刷新!= 标准存储库。
    【解决方案2】:

    也许你听错了或者有人说错了 - 存储库模式应该公开类似集合的行为,而不是对集合进行操作。就像您可以添加、删除和搜索集合中的项目一样,您的存储库提供了适用于您的数据库的保存、删除和搜索操作。

    我建议您下载S#arp Architecture 的代码。它包括一个存储库实现,您可以很容易地重用它。如果你不想依赖依赖,至少你可以花一些时间研究它们的实现,让你更好地了解如何自己处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      相关资源
      最近更新 更多