我想直接从应用程序服务访问 ISession(不使用存储库(http://ayende.com/blog/3955/repository-is-the-new-singleton))但是应用程序服务单元测试很难并且 Nhibernate 数据访问代码增加代码的复杂性(没有存储库模拟,我不想模拟存储库或内存数据库中的 sqllite 进行测试)
有没有从服务层访问 ISession 的有效方法?
我想直接从应用程序服务访问 ISession(不使用存储库(http://ayende.com/blog/3955/repository-is-the-new-singleton))但是应用程序服务单元测试很难并且 Nhibernate 数据访问代码增加代码的复杂性(没有存储库模拟,我不想模拟存储库或内存数据库中的 sqllite 进行测试)
有没有从服务层访问 ISession 的有效方法?
我使用一个 sessionHelper 基本上持有 ISessionFactory - 然后有这样的方法:
public T WrapQueryInTransaction<T>(Func<ISession, T> query)
{
using (var tx = Session.BeginTransaction())
{
try
{
var result = query(Session);
tx.Commit();
return result;
}
}
}
然后,我对常见功能有类似的方法 - 即。xxxUpdaters 基本上加载有问题的对象,进行更新,然后再次关闭 ISession。
然后查询的用法如下:
var entities = _sessionHelper.WrapQueryInTransaction(s => s.QueryOver<SomeEntity>().List());
对于复杂的查询,我将它们封装在一个查询类中,该类也可以在 sessionHelper 中抛出。
它对我有用 - 希望你能使用它。