簡體   English   中英

asp.net mvc應用程序中的工作單元模式

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

我一直在關注這個名為“NHibernate和工作單元模式”的優秀博客 ,並且有一個關於在asp.net mvc項目中使用UnitOfWork.Start的最佳位置的問題。

我的SLN分為以下幾個項目: -

 MVC project
 Repository
 NHibernateUnitOfWork

我有一個界面: -

 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;
                }
          }
     ...

我的問題是我使用(UnitOfWork.Start())將所有方法包裝在我的所有存儲庫中,還是有更好的方法?

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

使用工作單元模式,您不會將每個dataaccess方法放在單獨的工作單元中。 您可以圍繞需要完成的整個工作使用工作單元,這在大多數情況下是Web應用程序中的webrequest。 這個想法是請求可能失敗或成功。 在一個請求期間向數據庫添加2個項目時,應同時添加或不添加。 不只是其中之一。 在大多數情況下,在mvc(或其他Web)應用程序中啟動工作單元的最簡單方法是在global.asax的begin和end請求方法中

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);
     }
}

我認為Sharp Architecture很好地解決了這個問題。 他們所做的是將工作單元放在ASP .Net MVC Action Filter中。 基本上你可以定義一個事務Action過濾器,如


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

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

並在您的控制器類中將Transaction屬性放在Action Result方法上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM