2

現在、階層化アーキテクチャについて学んでおり、そのような設計にロギング システムを追加する方法を考えています。

ここで、3 つのレイヤーがあるとします。

  1. プレゼンテーション層
  2. ビジネスレイヤー
  3. データ アクセス層

そして、上位層のみが 1 レベル下の層を認識していると仮定します。たとえば、プレゼンテーション層はビジネス層を認識していますが、その逆は認識していません。

一般的なロガー クラスはどこに実装する必要がありますか?

  1. 別のプロジェクトに実装すると、すべてのレイヤーが共通のアセンブリに依存することになり、それが良い場合とそうでない場合があります。これは依存性注入で克服できますが。
  2. 最上位レベル (この場合はプレゼンテーション層) に実装すると、単一責任の原則に反することになります。

ロギング メカニズムを実装するのに適した場所はどこですか?

そして、それを実装した後、そのようなシステムを使用する方法は何ですか?

  1. キャッチされていない例外をキャッチし、例外の説明をどこかに保存できることが理想的です。
  2. どこで例外をキャッチする必要がありますか? 最上位レイヤー (プレゼンテーション レイヤー) でキャッチする必要がありますか? それとも別の場所で捕まえるべきですか?
  3. そして、ロガーをクラスに渡すために使用する方法は何ですか? のようなインターフェイスを受け入れるプロジェクト内のすべてにメソッド/コンストラクターのオーバーロードを追加することは理にかなっていますILoggerか?

ご覧のとおり、私はこのテーマについてかなり混乱しています。現在の仕事では、エンタープライズ アプリケーションを設計しているにもかかわらず、エンタープライズ アプリケーション設計/レイヤード デザインに関する知識を持っている人は誰もいません。したがって、正しい方向性を示す助けがあれば幸いです。

4

1 に答える 1

8

ロギングは分野横断的な関心事です。これは、アーキテクチャのすべてのレイヤーを包含することを意味し、別のライブラリとして実装することは理にかなっています。ただし、Log4Net、NLog、さらには .NET 独自の TraceSource などの非常に優れたソリューションが既に存在するため、これは演習としてのみ意味があります。

私は、階層ログをサポートするもの (log4net など) を好む傾向があります。これにより、実稼働システムで目的のトレース レベルを簡単に構成できます。たとえば、 to の一般的なトレース レベルを設定できますが、MyApp.SomeNamespacetoのようなWarning特定のタイプも設定できます。MyApp.SomeNamespace.AnInterestingClassDebug

「そのようなシステムを使用する方法は何ですか」の部分を理解したかどうかはわかりません。

アプリのすべてのレイヤーで、それを必要とする各メソッドで、必要な場所でログを使用します。すべてのエラーが処理され、ログに記録される集中化された場所のアイデアがあるという印象を受けていますが、これらは別のものです。

キャッチされていない例外をキャッチし、例外の説明をどこかに保存できることが理想的です。

いいえ、そうすべきではありません。ロガーはログに何かを書き込みますが、例外は処理しません。ロギングは、エラーを報告するためだけに使用されるわけではありません。また、運用中のシステムのトラブルシューティングや事後分析のために、アプリケーションの実行と多くの内部情報 (ただし、さまざまなトレース レベル) をログに記録する必要があります。

どこで例外をキャッチする必要がありますか?

すべてのレベルで。コード内の多くのメソッドは、現在のコンテキストに関連する例外を処理します。他の場所ではキャッチされなかった例外をどこで処理するかを本当に知りたいと思うと思います-ある種のキャッチオールハンドラー。このためには、最上位層、つまり .exe で、またはより一般的には、アプリケーション自体を表す型を含む層で行うのが理にかなっていることがよくあります。それには多くの方法があります。未処理の例外 ( ThreadException/UnhandledException )のハンドラーをASP.NET MVC の HandleError/Application_Error に単純に登録することから、私が個人的に嫌いな例外処理アプリケーション ブロックのようなものを使用することまで(Enterprise Library のほとんどのように) )。

そして、ロガーをクラスに渡すために使用する方法は何ですか? ILogger のようなインターフェイスを受け入れるプロジェクト内のすべてに、メソッド/コンストラクターのオーバーロードを追加することは理にかなっていますか?

実装によって異なります。依存性注入パスをたどりたいようです。ロガーは必須の依存関係ではないため (つまり、型の機能的な動作ではなく、実装に関連している)、IMO がすべきコンストラクターを介して処理するのではなく、オプションの依存関係としてプロパティ インジェクションを介して処理することをお勧めします。主要な依存関係 (タイプが適切に機能するために必要な依存関係) にのみ使用してください。

ただし、DI を使用したくない場合もあります。次に、ロガーに到達するための別の方法が必要です。ここでは、1 つのオプションについて説明します

于 2013-04-13T23:18:23.593 に答える