既存のコードベースに変更を加えずに機能を追加するという、3つのテクノロジがすべて同じことを意図しています。
ASP.NET MVCとDIの両方で、に制限があります。では、コードを編集できないため、テクノロジがいくつかの場所で動作を追加できるため、名前付きフィルタまたはインターセプタを使用できます。 PostSharpなどのコンパイラベースのテクノロジだけが、あらゆる側面を追加できます。しかし、3つはすべてAOPの概念の実装です。
多くの用途では、従来のオブジェクト指向プログラミングに比べ、さまざまな利点があります。すべての単一の問題は、同じコストでより優れた設計の従来のOOPによって解決できるということは当てはまりません。しかし、AOPは主流ではなく、非主流技術(AOPは90年代に生まれ、OOPは60年代に生まれた)を使用することに関連するコストとリスクがあることは間違いありません。どの革新と同様に、異なるアクターはリスクと利益の感受性が異なるため、早期または後期の採用者になる可能性があります。
AOPは単体テストの障害ではありませんが、トピックに関する共通の経験はほとんどありません。一般に、アスペクトは別々のコード単位としてテストする必要があります。本質的かつ不可欠な側面があります。通常、ビジネスコードは必須の側面とともにテストする必要がありますが、非本質的な側面は無効にする必要があります。アスペクトをビルド時に静的に無効にすることができます(ビルド構成から一部のアスペクトを除外するだけです)。または実行時に(アスペクトをテスト中にfalseに設定する静的変数に依存させます)。
コンパイル時間の注入はどのようにユニットテストに干渉しますか?あなたが知っていることをコンパイルせずに単体テストさえしないでしょうか? – jfar
@jfar:あなたのプロダクションコードは、コンパイル時にアスペクトと一緒にウィービングされます。このため、プロダクションコードを単独でテストすることはできません。単体テストがいくつかのプロダクションコードを呼び出すと、そのアスペクトは常に適用されます。実際、単体テストはできません。単体テストは単体で実行されるためです。あなたが持っているのは、統合テストです。今あなたのdownvoteを元に戻すように? – Steven
あなたのコードは常にコンパイラによって一緒に織り込まれています。プロダクションとユニットテストはコンパイラによって異なるバージョンが得られる可能性があります。デコレータやDIなどでコードを書くことができます。この答えの瑕疵は、AOPやPostSharpがユニークで注目すべき方法でユニットテストに影響を与えないということです。 – jfar