我一直在看这个优秀的blog标题为“NHibernate 和工作单元模式”,并且有一个关于在 asp.net mvc 项目中使用 UnitOfWork.Start 的最佳位置的问题。
我的 SLN 分为以下项目:-
MVC project
Repository
NHibernateUnitOfWork
我有一个接口(interface):-
public interface INameRepository
...
IList<Name> GetByOrigin(int OriginId)
...
我有一个具体的实现
public class NameRepository : INameRepository
...
public IList<Name> GetByOrigin(int OriginId) {
using (UnitOfWork.Start()) {
var query = session.Linq<...
return query;
}
}
...
我的问题是我是使用 using(UnitOfWork.Start()) 将我的所有方法包装在我的所有存储库中还是有更好的方法?
我正在使用 nHibernate,asp.net mvc。
最佳答案
使用工作单元模式,您不必将每个数据访问方法都放在一个单独的工作单元中。您围绕需要完成的整个工作使用工作单元,这在大多数情况下在 Web 应用程序中是一个 Web 请求。这个想法是请求可以失败,也可以成功。当您在一个请求期间向数据库添加 2 个项目时,应该同时添加或不添加。不只是其中之一。在大多数情况下,在 mvc(或其他 Web)应用程序中启动工作单元的最简单方法是在 global.asax 的开始和结束请求方法中
class Global
{
BeginRequest()
{
servicelocater.get<unitofwork>().start();
}
EndRequest()
{
var unit = servicelocater.Get<Unitofwork>();
try
{
unit.commit();
}
catch
{
unit.rollback();
throw;
}
}
}
class Repository<T>
{
public Repository(INHibernateUnitofwork unitofwork)
{
this.unitofwork = unitofwork;
}
public void Add(T entity)
{
unitofwork.session.save(entity);
}
}
关于c# - asp.net mvc 应用程序中的工作单元模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1981865/