使用nHibernate和存储库模式,需要一些方向

时间:2009-08-18 21:55:02

标签: nhibernate fluent-nhibernate repository-pattern

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

我喜欢它的一件事是我可以使用Repository模式(从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类,然后我可以添加特定于该实体的方法。

当尝试添加Update方法时,有人提到Repository模式假设对集合起作用?我在这里看错了吗?为什么我不能创建更新方法?

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

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

2 个答案:

答案 0 :(得分:2)

不要使用存储库模式 - 改为使用UnitOfWork模式,并将已定义的查询ICriteria传递给ISession。从本质上讲,Repo模式包装的东西不需要用NH包裹。

请参阅http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx了解详情

答案 1 :(得分:1)

也许你听错了或有人误导 - Repository模式应该暴露集合之类的行为,而不是对集合进行操作。就像您可以添加,删除和搜索集合中的项目一样,您的存储库提供了针对您的数据库的保存,删除和搜索操作。

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