使用nHibernate和存储库模式,需要一些指导

使用nHibernate和存储库模式,需要一些指导,nhibernate,fluent-nhibernate,repository-pattern,Nhibernate,Fluent Nhibernate,Repository Pattern,好的,我刚刚进入nhibernate(使用fluent) 我喜欢它的一点是,我可以使用存储库模式(从nhibernate rhino博客上阅读) 基本上,通过使用泛型,我可以创建可以跨所有数据库表工作的方法 public interface IRepository<T> { T GetById(int id); ICollection<T> FindAll(); void Add(T entity);

好的,我刚刚进入nhibernate(使用fluent)

我喜欢它的一点是,我可以使用存储库模式(从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);
        }    

    }
公共接口IRepository
{
T GetById(int-id);
i收集FindAll();
无效添加(T实体);
无效删除(T实体);
}
公共类存储库:IRepository
{
公开会议
{
得到
{ 
返回SessionProvider.GetSession();
}
}
公共T GetById(int-id)
{
返回会话.Get(id);
}
公共ICollection FindAll()
{
return Session.CreateCriteria(typeof(T)).List();
}
公共无效添加(T)
{
Session.Save(t);
}
公共空间移除(T)
{
删除(t);
}    
}
然后我继承Repository类,然后可以添加特定于该实体的方法

当尝试添加更新方法时,有人提到存储库模式应该作用于集合?我是不是看错了?为什么我不能创建一个更新方法

我尝试添加一个更新方法,但我不知道如何处理会话和更新数据库


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

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


有关更多信息,请参见

可能是您听错了或有人错传了-存储库模式应该公开类似集合的行为,而不是对集合进行操作。正如您可以添加、删除和搜索集合中的项目一样,存储库提供了针对数据库的保存、删除和搜索操作


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

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