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

Fre*_*ith 6 c# nhibernate asp.net-mvc unit-of-work

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

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

 MVC project
 Repository
 NHibernateUnitOfWork
Run Code Online (Sandbox Code Playgroud)

我有一个界面: -

 public interface INameRepository
 ...
       IList<Name> GetByOrigin(int OriginId)
 ...
Run Code Online (Sandbox Code Playgroud)

我有一个具体的实现

     public class NameRepository : INameRepository
     ...
          public  IList<Name> GetByOrigin(int OriginId) {
                using (UnitOfWork.Start()) {
                     var query = session.Linq<...
                     return query;
                }
          }
     ...
Run Code Online (Sandbox Code Playgroud)

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

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

Emm*_*uel 2

我认为夏普架构很好地解决了这个问题。他们所做的是将工作单元放入 ASP .Net MVC 操作过滤器中。基本上你可以定义一个事务操作过滤器,例如


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

      public override void OnActionExecuted(ActionExecutedContext filterContext)
      {
         UnitOfWork.Stop();
      }
}

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

  • 这种方法的缺点是每个子控制器/渲染操作都位于单独的工作单元中 (9认同)