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

我目前正在开发一个中型应用程序,它将访问不同站点上的两个或更多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等……

任何指针都非常受欢迎。

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

public interface IRepository : IQueryable { void Add(T entity); T Get(Guid id); void Remove(T entity); } public class Repository : IQueryable { private readonly ISession session; public Repository(ISession session) { session = session; } public Type ElementType { get { return session.Query().ElementType; } } public Expression Expression { get { return session.Query().Expression; } } public IQueryProvider Provider { get { return session.Query().Provider; } } public void Add(T entity) { session.Save(entity); } public T Get(Guid id) { return session.Get(id); } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } public IEnumerator GetEnumerator() { return session.Query().GetEnumerator(); } public void Remove(T entity) { session.Delete(entity); } } 

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

 public interface IUnitOfWork : IDisposable { void Commit(); void RollBack(); } 

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

 public interface INHiberanteUnitOfWork : IUnitOfWork { ISession Session { get; } } 

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

以下是我对通用存储库的看法:

为每个对象创建通用存储库与特定存储库的优势?

我已经成功地将该模式与NHibernate一起使用,并没有发现任何真正的缺点。

要点是,真正的通用存储库有点像红色鲱鱼,但通过稍微不同地思考问题可以实现同样的好处。

希望有所帮助。