2009-08-18 42 views
2

好吧,我只是进入nhibernate(使用流利)。我喜欢它的原因使用nHibernate和存储库模式,需要一些方向

一件事是,我可以使用库模式(从NHibernate的犀牛博客读到它)。

基本上使用泛型,我可以创建,将工作翻过我所有的数据库表的方法。

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); 
     }  

    } 

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

当试图添加一个更新的方法,有人提到,库模式是假设作用于收藏?我在这里看错了吗?为什么我无法创建更新方法?

我尝试添加一个更新的方法,但我很困惑,我将如何处理会话,并更新数据库?

我想为每个实体的所有我的数据库访问一个地方,所以UserRepository将所有基本的CRUD然后也许一些其他的方法,如GetUserByEmail()等

回答

2

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

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

+4

我认为其误导性暗示的工作和资源库模式的单元是可以互换的,因为他们解决不同的问题。我对Ayende的这篇文章很熟悉,虽然我确实认为它确实有一些事实,但请记住它只是一个意见,不应该作为事实陈述。 – 2009-08-18 22:24:10

+0

ight,但是如果你正在学习NH,那么从Repository模式开始(在每次调用repo.Update()时都会刷新)是一个坏习惯。或者你最终可能会写出一些怪异的Repo和UoW的混合体,看起来像是Repo,但仍然需要被冲刷掉,或者错过了这个不连贯的UoW的伟大。在我看来,宅基地已经拿起了一些教程,正在迈出他的第一步,并且为了他所需要的走向稍微错误的路线,以及学习NH的最佳途径是什么。 – mcintyre321 2009-08-18 22:37:24

+0

但是,你说得对,我听起来像是一个全面的声明。回购模式在正确的情况下非常有用。我应该说“在这种情况下,国际海事组织的回购模式正在包装的东西......” – mcintyre321 2009-08-18 22:38:56

1

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

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

+0

S#arp架构现在位于http://wiki.sharparchitecture.net/ – cori 2013-08-01 15:35:25