6

「NHibernate と Unit of Work パターン」というタイトルのこの優れたブログを見ていて、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;
                }
          }
     ...

私の質問は、すべてのリポジトリ内のすべてのメソッドを using(UnitOfWork.Start()) でラップするか、それともより良いアプローチがありますか?

nHibernate、asp.net mvc を使用しています。

4

2 に答える 2

4

作業単位パターンでは、すべてのデータアクセス メソッドを個別の作業単位に入れる必要はありません。実行する必要がある作業全体に作業単位を使用します。これは、ほとんどの場合、Web アプリケーションでは webrequest です。アイデアは、リクエストが失敗または成功する可能性があるということです。1 回のリクエストで 2 つのアイテムをデータベースに追加する場合、両方を追加する必要があります。それらの1つだけではありません。ほとんどの場合、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);
     }
}
于 2009-12-30T20:16:06.757 に答える
2

シャープの建築はこれをうまく解決してくれると思います。彼らが行うことは、ASP .Net MVC アクション フィルター内に作業単位を配置することです。基本的に、次のようなトランザクション アクション フィルターを定義できます。


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

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

コントローラ クラスで、Action Result メソッドに Transaction 属性を設定します。

于 2009-12-30T19:33:57.357 に答える