使用具有流畅的nHibernate的Generic Repository模式

Ale*_*lex 13 c# nhibernate repository-pattern

我目前正在开发一个中型应用程序,它将访问不同站点上的两个或更多SQL数据库等...

我正在考虑使用类似的东西:http: //mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.html

但是,我想使用流畅的nHibernate代替Linq-to-SQL(当然还有nHibernate.Linq)

这可行吗?

我该如何配置呢?我的映射定义会在哪里等...?

该应用程序最终将具有许多方面 - 来自WebUI,WCF库和Windows应用程序/服务.

另外,例如在"产品"表上,我是否会创建一个"ProductManager"类,它具有以下方法:

GetProduct,GetAllProducts等......

任何指针都非常受欢迎.

Pac*_*aco 22

在我看来(以及其他一些人的意见),存储库应该是一个在模仿集合接口的界面中隐藏数据访问的接口.这就是存储库应该是IQueryable和IEnumerable的原因.

public interface IRepository<T> : IQueryable<T>
{
  void Add(T entity);
  T Get(Guid id);
  void Remove(T entity);
}

public class Repository<T> : IQueryable<T>
{
  private readonly ISession session;

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

  public Type ElementType
  {
    get { return session.Query<T>().ElementType; }
  }

  public Expression Expression
  {
    get { return session.Query<T>().Expression; }
  }

  public IQueryProvider Provider
  {
    get { return session.Query<T>().Provider; } 
  }  

  public void Add(T entity)
  {
    session.Save(entity);
  }

  public T Get(Guid id)
  {
    return session.Get<T>(id);
  }

  IEnumerator IEnumerable.GetEnumerator()
  {
    return this.GetEnumerator();
  }

  public IEnumerator<T> GetEnumerator()
  {
    return session.Query<T>().GetEnumerator();
  }

  public void Remove(T entity)
  {
    session.Delete(entity);
  }   
}
Run Code Online (Sandbox Code Playgroud)

我没有在存储库本身中实现类似SubmitChanges的方法,因为我想一次提交用户的一个操作所使用的几个存储库的更改.我在一个工作单元界面中隐藏了事务管理:

public interface IUnitOfWork : IDisposable
{
  void Commit();
  void RollBack();
}
Run Code Online (Sandbox Code Playgroud)

我使用NHibernate特定工作单元实现的会话作为存储库的会话:

public interface INHiberanteUnitOfWork : IUnitOfWork
{
  ISession Session { get; } 
}
Run Code Online (Sandbox Code Playgroud)

在一个真实的应用程序中,我使用一个更复杂的存储库接口,其中包括分页,预先加载,规范模式,访问NHiberante使用的其他查询方式而不仅仅是linq.NHibernate主干中的linq实现对我需要做的大多数查询都足够好.

  • 我们能看到"更复杂的存储库界面"是什么样的吗?这是好事,但我也希望能够做"之类的东西分页,预先加载,规范模式,进入查询使用NHiberante,而不仅仅是LINQ的其他方式".此外,如果您可以演示如何使用它,将会很有帮助.谢谢! (2认同)