2011-10-19 9 views
0

私は作業パターンの単位でasp.net mvcとnhibernateを使用しています。何かがnullの場合これはどうすれば設計できますか?方法のNhibernate作業単位

私はだから私のif文でこの

public bool IsSomething() 
{ 
    unitOfWork.BeginTransaction(); 
    var myGetStuff = repo.GetStuff(1); 

    if(myGetStuff == null) 
    { 
     return false; 
    } 

    var somethingElse = myGetStuff.GetSomethingElse(); 

    if(somethngElse == null) 
    { 
     return false; 
    } 

    return true; 
} 

のようなものを持っていると私はちょうどの文から抜け出すヌルではない、それを必要とします。

これは、ネストされたif文がネストされているように4回または5回ネストされているように見えることと反対です。

public bool IsSomething() 
{ 
    unitOfWork.BeginTransaction(); 
    var myGetStuff = repo.GetStuff(1); 

    if(myGetStuff != null) 
    { 
     var somethingElse = myGetStuff.GetSomethingElse(); 

     if(somethngElse != null) 
     { 
      // some more check heere (could have another few if statements null checks here) 
     } 
    } 
} 

したがって、ifステートメントのネストされたレベルを読みやすくする最初の方法がわかります。

nhibernateでクエリを実行しても、にする必要があります。トランザクションではラップし、最後にはロールバックまたはコミットしてください。

オプション1

public bool IsSomething() 
    { 
     unitOfWork.BeginTransaction(); 
     var myGetStuff = repo.GetStuff(1); 

     if(myGetStuff == null) 
     { 
      unitOfWork.Commit(); 
      return false; 
     } 

     var somethingElse = myGetStuff.GetSomethingElse(); 

     if(somethngElse == null) 
     { 
     unitOfWork.Commit(); 
      return false; 
     } 

     unitOfWork.Commit(); 
     return true; 
    } 

あなたはどこにでもコミット入れて維持するために持っているように、私は好きではないこの方法です。可能であれば、私は(私は仕事の取引の1単位以上のものを持っていない限り)一つだけのコミット持っているのが大好きだ

ついにこの

public bool IsSomething() 
    { 
    try 
    { 
      unitOfWork.BeginTransaction(); 
      var myGetStuff = repo.GetStuff(1); 

      if(myGetStuff == null) 
      { 
       return false; 
      } 

      var somethingElse = myGetStuff.GetSomethingElse(); 

      if(somethngElse == null) 
      { 

       return false; 
      } 

      return true; 
     } 
     catch(Exception ex) 
     { 
      unitOfWork.RollBack(); 
     } 
     finally 
     { 
      unitOfWork.Commit(); 
     } 
    } 

のように入れていない理由それでは私はしかし私はこれが好きですが、コミットが失敗した場合に何が起こるかを認識しましたか?ロールバックされず、例外は捕捉されません。

だれでも他にもアイデアがありますか?

+0

のように見えるのでしょうか? – Firo

+0

メソッドによっては、読み込み/更新/挿入が混在している場合や、読み込みがあるだけの場合があります。 – chobo2

答えて

1

あなたの外見のこのコードは、特にネストされた作業単位の呼び出しがあるときには、問題があります(それらをどのように処理しますか?)。私が行うことは、IsSomething関数ではなく、呼び出しコード(ASP.Net MVCを使用している場合はコントローラ)で作業単位(およびトランザクション)を開くことです。それは次のようになります。

try 
{ 
    unitOfWork.BeginTransaction(); 
    // some code 
    var isSomething = IsSomeThing() 
} 
catch(Exception ex) 
{ 
    unitOfWork.RollBack(); 
} 
finally 
{ 
    unitOfWork.Commit(); 
} 

あなただけ読みますか、また、挿入/更新しないIsSomething機能は、単にこの

public bool IsSomething() 
{ 
    var myGetStuff = repo.GetStuff(1); 

    if(myGetStuff == null) 
    { 
     return false; 
    } 

    var somethingElse = myGetStuff.GetSomethingElse(); 

    if(somethngElse == null) 
    { 

     return false; 
    } 

    return true; 
} 
+0

入れ子の作業単位が何であるか分かりません。これは私が考えたことだが確信が持てないものです。 IsSomethingは私のすべてのビジネスロジックがある私のサービス層にあります。私は、自分のプロジェクトに自分のサービスレイヤーを設定し、できるだけmvcから独立させて、そのプロジェクトを受け取り、別のプロジェクト(Webサービスなど)で使用できるようにしました。だからサービスレイヤーであれば.dllにするのではなく、突然あなたがUoWでそれをラップする必要があるのであれば、それはいいだろう。最初はコントローラーにいなければわかりませんでしたか? – chobo2

+0

また、複数のトランザクションが必要な場合はどうしますか? – chobo2

+0

私は、ネストされた作業単位の意味は次のとおりです。あなたはコードを持っています(コントローラーと呼ぶ)。最初にUoW.BeginTransaction()を呼び出し、最後にUoW.Commitを呼び出します。そして、このコントローラーの内部では、UoW.Commitも持つIsSomething関数を呼び出します。これがあなたの最初のUoW.BeginTransactionに干渉しないでしょうか?私がしているのは、httpモジュールでトランザクションを開始、コミット、ロールバックすることです。 – zszep

関連する問題