The unit of work pattern within a asp.net mvc application

心已入冬 提交于 2019-12-02 19:47:25

With the unit of work pattern, you don't put every dataaccess method in a separate unit of work. You use the unit of work around the whole work that needs to be done, which is in most cases in a web application a webrequest. The idea is that a request can fail, or succeed. When you add 2 items to the database during one request, the should be both added, or not. Not just one of them. In most cases, the easiest way to start a unit of work in a mvc (or other web) application is in the begin and end request methods of the 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);
     }
}

I think Sharp Architecture solves this quite well. What they do is put the unit of work inside an ASP .Net MVC Action Filter. Basically you can define a transaction Action filter such as


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

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

and in your controller class put the Transaction attribute on your Action Result method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!