好的,我刚刚进入nhibernate(使用流利的)。
我喜欢它的一件事是我可以使用Repository模式(从nhibernate rhino博客中读到它)。
基本上使用泛型,我可以创建适用于所有数据库表的方法。
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);
}
}
然后我继承了Repository类,然后我可以添加特定于该实体的方法。
当尝试添加Update方法时,有人提到Repository模式假设对集合起作用?我在这里看错了吗?为什么我不能创建更新方法?
我尝试添加更新方法,但是我对如何处理会话和更新数据库感到困惑?
我希望每个实体的所有数据库访问都有一个位置,因此UserRepository将具有所有基本CRUD,然后可能还有一些其他方法,如GetUserByEmail()等。
答案 0 :(得分:2)
不要使用存储库模式 - 改为使用UnitOfWork模式,并将已定义的查询ICriteria传递给ISession。从本质上讲,Repo模式包装的东西不需要用NH包裹。
请参阅http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx了解详情
答案 1 :(得分:1)
也许你听错了或有人误导 - Repository模式应该暴露集合之类的行为,而不是对集合进行操作。就像您可以添加,删除和搜索集合中的项目一样,您的存储库提供了针对您的数据库的保存,删除和搜索操作。
我建议您下载S#arp Architecture的代码。它包含一个可以轻松重用的存储库实现。如果你不想接受依赖,至少你可以花一些时间研究它们的实现,让你更好地了解如何自己处理它。