asp.net mvc应用程序中的工作单元模式

我一直在关注这个名为“NHibernate和工作单元模式”的优秀博客 ,并且有一个关于在asp.net mvc项目中使用UnitOfWork.Start的最佳位置的问题。

我的SLN分为以下几个项目: –

MVC project Repository NHibernateUnitOfWork 

我有一个界面: –

  public interface INameRepository ... IList GetByOrigin(int OriginId) ... 

我有一个具体的实现

  public class NameRepository : INameRepository ... public IList GetByOrigin(int OriginId) { using (UnitOfWork.Start()) { var query = session.Linq<... return query; } } ... 

我的问题是我使用(UnitOfWork.Start())将所有方法包装在我的所有存储库中,还是有更好的方法?

我正在使用nHibernate,asp.net mvc。

使用工作单元模式,您不会将每个dataaccess方法放在单独的工作单元中。 您可以围绕需要完成的整个工作使用工作单元,这在大多数情况下是Web应用程序中的webrequest。 这个想法是请求可能失败或成功。 在一次请求期间向数据库添加2个项目时,应同时添加或不添加。 不只是其中之一。 在大多数情况下,在mvc(或其他Web)应用程序中启动工作单元的最简单方法是在global.asax的begin和end请求方法中

 class Global { BeginRequest() { servicelocater.get().start(); } EndRequest() { var unit = servicelocater.Get(); try { unit.commit(); } catch { unit.rollback(); throw; } } } class Repository { public Repository(INHibernateUnitofwork unitofwork) { this.unitofwork = unitofwork; } public void Add(T entity) { unitofwork.session.save(entity); } } 

我认为Sharp Architecture很好地解决了这个问题。 他们所做的是将工作单元放在ASP .Net MVC Action Filter中。 基本上你可以定义一个事务Actionfilter,如

public class TransactionAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { UnitOfWork.Start(); } public override void OnActionExecuted(ActionExecutedContext filterContext) { UnitOfWork.Stop(); } }
public class TransactionAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { UnitOfWork.Start(); } public override void OnActionExecuted(ActionExecutedContext filterContext) { UnitOfWork.Stop(); } } 

并在您的控制器类中将Transaction属性放在Action Result方法上