[英]Using a Generic Repository pattern with fluent nHibernate
我目前正在开发一个中型应用程序,它将访问不同站点上的两个或更多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<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);
}
}
我没有在存储库本身中实现类似SubmitChanges的方法,因为我想一次提交用户的一个操作所使用的几个存储库的更改。 我在一个工作单元界面中隐藏了事务管理:
public interface IUnitOfWork : IDisposable
{
void Commit();
void RollBack();
}
我使用NHibernate特定工作单元实现的会话作为存储库的会话:
public interface INHiberanteUnitOfWork : IUnitOfWork
{
ISession Session { get; }
}
在一个真实的应用程序中,我使用一个更复杂的存储库接口,其中包含分页,预先加载,规范模式,访问NHiberante使用的其他查询方式而不仅仅是linq的方法。 NHibernate主干中的linq实现对我需要做的大多数查询都足够好。
以下是我对通用存储库的看法:
我已经成功地将该模式与NHibernate一起使用,并没有发现任何真正的缺点。
要点是,真正的通用存储库有点像红色鲱鱼,但通过略微区别地思考问题可以实现同样的好处。
希望有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.