4

我是新来NHibernate,我努力工作教学贯彻的通用Repository模式单位使用在ASP.NET MVC 3应用。我搜索了标题并发现了新的链接;但所有这些对我来说都是比较复杂的。我使用StructureMap作为我的IOC。你能给我建议一些链接或博客吗?如何实现通用仓库模式和UOW NHibernate的3.2

+1

NHibernate的ISession已经代表了一个工作单元和对存储库的访问。 – 2012-03-04 16:59:11

+0

存储库应该封装数据访问层,即它将使用但不会公开Nhibernate。和一个适当的设计的存储库(为您的需要,一个通用的存储库是无用的)不应该需要工作单位 – MikeSW 2012-03-04 19:09:21

回答

5

这里有几个项目的读通:

实现我在最近的项目都使用看起来像:

public interface IRepository<T> 
{ 
    IEnumerable<T> GetAll(); 
    T GetByID(int id); 
    T GetByID(Guid key); 
    void Save(T entity); 
    void Delete(T entity); 
} 

public class Repository<T> : IRepository<T> 
{ 
    protected readonly ISession Session; 

    public Repository(ISession session) 
    { 
     Session = session; 
    } 

    public IEnumerable<T> GetAll() 
    { 
     return Session.Query<T>(); 
    } 

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

    public T GetByID(Guid key) 
    { 
     return Session.Get<T>(key); 
    } 

    public void Save(T entity) 
    { 
     Session.Save(entity); 
     Session.Flush(); 
    } 

    public void Delete(T entity) 
    { 
     Session.Delete(entity); 
     Session.Flush(); 
    } 
} 
+0

谢谢;我知道了。但是现在,我怎样才能通过注入创建一个'ISession'对象? '公共库(ISession会话)',但似乎'ISession'只能通过'OpenSession'方法创建;例如,如何通过StructureMap使用这个存储库?能多解释一下吗? – 2012-03-04 19:15:06

+1

@ king.net我自己在结构图上使用ninject,但是类似的概念也适用。在ninject中,我会做这样的事情:绑定().ToMethod(x => NHibernateHelper.OpenSession())。InRequestScope(); – Jesse 2012-03-04 19:27:06

+0

感谢帮助完整的答案,接受它;问候 – 2012-03-05 03:29:49

1

查看此解决方案 - https://bitbucket.org/cedricy/cygnus/overview

它是我们在生产MVC 1,2和3应用程序中使用的存储库模式的简单实现。

当然,我们从那以后就知道我们非常感谢让我们的查询直接运行在ISession上。你有更多的控制他们的方式。那和Ayende告诉我们不要。

谢谢塞德里克!

+0

谢谢。答案投了。问候 – 2012-03-05 18:57:27