2011-10-26 3 views
28

ロギングはAOPの主な使用例です。さらに、クラスを特定のロギング実装と結合しないようにDIを使用する場合として、ロギングラッパーも例示されています。しかし、some consider logging wrappers an anti-pattern。主に、このようなビューは、ほとんどの場合、ラッパーが単純化され、ロギングフレームワークに特有の多くの機能を削除する傾向があるためです。これらの機能を実装する場合は、フレームワークを直接使用するだけではいかがですか。ロギング、アスペクト指向プログラミング、および依存性注入 - すべてのことを理解しようとしています

私はCommon.Loggingファサードに、log4Net、EntLib、NLogの機能を十分に抽象化しようとしていることに気付いています。しかし、ここでも、Common.Loggingに依存しています。インターフェースやそのようなコードやユニットのテスト方法ではなく、プロジェクトが終了したとき(最後のリリースから1年以上経過している)、またはサポートされていないロガーに後から切り替える場合は、問題が発生する可能性があります。前記

ロギングをAOPを介して達成された場合、それは(すなわち理由だけ直接NLogを言う参照しない)ログ依存ためのDIを使用することも必要ですか?はい、コードのAOP部分は緊密に結合されていますが、単体テストをしたいクラスのロジックには少なくともロギングが発生する前にロギング依存関係がありません。この時点で私は少し失われている(私はまだAOPを試していない)。製織後、AOPコードにDIを使用しないと、テスト対象のメソッドを単体テストする際に問題が発生しますか?または、AOPコードを製織することなく、単体テストをテストできますか?

ロギングがソフトウェアのユーザーの要件でない限り、モックでロギングが発生したことをテストすることがどれほど有用かはわかりません。私は、テスト対象メソッドのビジネスロジックが、テストに最も関心のあるものであると考えています。最後に、TDD/BDDを使用する場合は、AOPコードのロギング依存関係にDIを使用する必要はありませんか?または、1つだけではない試乗物事のAOP側?

私は、クロスカットに関するAOPと設計/テストのためのDIの両方を使用するアプリケーションを開発するための最も実用的なアプローチを感じています。 AOPは比較的新しく、ロギングが最も一般的な例であるため、推奨されるアプローチは何ですか?

+0

関連:https://stackoverflow.com/questions/9892137/windsor-pulling-transient-objects-from-the-container – Steven

答えて

47

ログはサービスではありません。cross-cutting concernです。したがって、Decoratorで実装するのが最適です。しかし、さまざまなサービスのロギングを可能にするためにたくさんのデコレータを追加すると、DRYに違反する傾向があります。その場合、デコレータをさらに1つのインターセプタに進化させることができます。

ですが、AOPを実装するためにIL製織を使用すると、はるかに軽量なソリューションであるため、動的傍受をサポートするDIコンテナを使用することをお勧めします。

これにより、具体的なサービスとログを完全に分離することができます。その場合、特定のロギングフレームワークをラップする理由はないと思います。ロギングフレームワークを変更したい場合は、その単一のインターセプタを変更するだけで済みます。

Here's an example(装飾と迎撃器については、計測器用です(ロギングと非常によく似ています)。

AOPとDIの詳細については、view online this talk I gave at GOTO Copenhagen 2010をご覧ください。

+0

私はこのマークに返信したいと考えていました。私はあなたの洞察力を、DIに関連するすべてのものに非常に役立つと同時に、単体テスト(automockingなど)と同様に見つけました。私はあなたの例を見て話します。副次的な質問:動的傍受よりもAOPが望ましい状況はありますか? – Matt

+3

ダイナミックインターセプトも* AOPです:)しかし、私はあなたの質問をILウィービングによってAOPに関連するものとして解釈します。その場合、グリーンフィールドプロジェクトでは、私はそれから何のメリットも全く見ませんが、レガシーコードでは、スタティック、内部、および/またはプライベートのタイプとメンバーに側面を適用できるので、実用的かもしれません。インターフェイス(または基本クラス)に対してプログラミングします。 –

+0

デコレータパターンには同意しません。あなたのアセンブリ内のすべてのクラスをロガーで装飾しているからです。 IProcessorを実装しているクラスは、装飾を可能にするためにIProcessorを実装する対応するロガーを持ちます。 – vijayst

関連する問題