3

この問題はテクノロジに依存しませんが、私は C# と ASP.NET を使用しており、これを疑似コードに使用します。どちらがより良いアプローチで、その理由は?

  1. ロギング、トランザクション、および例外処理をカプセル化します。

    protected void Page_Load(object sender, EventArgs e) {
     SomeBusinessClass.SomeBusinessMethod();
    }
    
    
    public class SomeBusinessClass {
      public void SomeBusinessMethod() {
        using (TransactionScope ts = new TransactionScope()) {
                    doStuff();
                    ts.Complete();
                }
                catch (Exception ex) {
                    LogError("An error occured while saving the order", ex);
                }
            }
        }
    }
    
  2. ロギング、トランザクション、および例外処理を呼び出し元に委譲します。

    protected void Page_Load(object sender, EventArgs e) {
        using (TransactionScope ts = new TransactionScope()) {
              try {
                    SomeBusinessClass.SomeBusinessMethod();
                    ts.Complete();
              }
              catch (Exception ex) {
                    LogError("An error occured while saving the order", ex);
              }
         }
    }
    
    
    public class SomeBusinessClass {
      public void SomeBusinessMethod() {
          doStuff();
        }
    }
    

ビジネス ロジック コードにロギングやトランザクションなどへの依存関係を導入することで、一般的でなくなるのではないかと懸念しています。一方、UI コードは非常にきれいに見えます。電話に出られません。他に考慮すべき要素を教えてください。

4

3 に答える 3

5

トランザクション: ビジネス層の中心的な関心事であるため、これを完全に処理する必要があります (ただし、作業単位の実装を介してトランザクション処理を集中化することはできます)。

更新:この部分にはもう同意しません。多くの場合、コントローラー、プレゼンター、または別の最上位の呼び出し元は、トランザクションを処理するのに最適な場所です (オニオン アーキテクチャのように) - 多くの場合、ここで論理的な作業単位が定義されます。

例外処理: すべてのレイヤーで必要に応じて使用しますが、実際に何かを実行できる場合にのみビジネスレイヤーで使用します(ログに記録するだけではありません)。インフラストラクチャがサポートしている場合は、UI レイヤーでグローバル ハンドラーを使用します。

Logging : 必要なレイヤーでトレースまたは情報ログを使用し、最上位レイヤーで例外のみをログに記録します。

于 2009-11-19T18:02:47.590 に答える
2

制御の反転を使用:

protected void Page_Load(object sender, EventArgs e) {
 new SomeBusinessClass(_logger, _dbcontext, _exceptionhandler).SomeBusinessMethod();
}

より良いものは

protected void Page_Load(object sender, EventArgs e) {
  _mybusinessclass.SomeBusinessMethod();
}

ここで、_mybusiness クラスは、入力された _logger、_dbcontext、および _exceptionhandler とともに、IoC コンテナーを介してページに渡されます。_exceptionhandler を手動で作成する必要がある場合 (「new RedirectExceptionHandler(this)」など)、

protected void Page_Load(object sender, EventArgs e) {
  _mybusinessclass.SomeBusinessMethod(new RedirectExceptionHandler(this));
}

最終的には、特定の設計上の決定に帰着します。ただし、MVC を使用しているため、ASP.NET で IoC を実行する方法がわかりません。

別のオプションは、アスペクト指向プログラミングを使用して例外をキャッチし、ログを記録することです。さらに別のオプション (www.sharparchitecture.net で利用可能) は、メソッドで [Transaction] 属性を使用してトランザクションを宣言的に処理することです。

于 2009-11-19T18:23:11.150 に答える
1

UI を薄くするものはすべて、作業を楽にしてくれます。

于 2009-11-19T17:58:17.320 に答える