2

好的,所以我刚刚进入休眠状态(使用流利的)。

我喜欢它的一件事是我可以使用存储库模式(从 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() 等。

4

2 回答 2

2

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

有关更多信息,请参见http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx

于 2009-08-18T22:05:36.440 回答
1

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

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

于 2009-08-18T22:19:02.403 回答