質問
C#、VB.netには多くのAOP実装があります。これはAOP実装の一部です:
- PostSharp
- LOOM.NET
- Aspect.NET
- エンタープライズライブラリ3.0ポリシーインジェクションアプリケーションブロック
- AspectDNG
- DotSpect (.SPECT)
- 機能の一部としての Spring.NET フレームワーク
- ウィッカおよびPhx.Morph
- AOSDソリューションの徹底的な分析for .NET はTwente Universityから入手できます
- Seasar.NET
- アスペクト#
- Puzzle.NAspect
- 作成*
- SetPoint
- NConcern .NET AOP Framework
- ...
.NetでのAOPの最適な実装は何ですか?使用すべきもの
解決
Castle Dynamic Proxy は、動的なインターセプトがニーズ。このフレームワークは、AOP機能を提供したい他の多くのフレームワークによって内部的に使用されます。通常、既存のIoCコンテナーのほとんどは、現在、いくつかの動的なインターセプトメカニズム(Spring.NET、Castle Windsor、StructureMapなど)を提供しています。 >
動的インターセプトではニーズに対応できない場合(封印されたクラスのウィーブ、非仮想呼び出しのインターセプトなど)、静的ウィービングが必要です。 PostSharp はこのドメインの参照です。
これは Linfu にも存在し、両方のAOPファッションを活用するために使用できることに注意してください。
他のヒント
"ベスト"主観的です。
まず、必要な機能、アーキテクチャなどのリストを作成します。次に、不要な複雑さを招くことなく、必要な機能を実行するオプションを探します。たとえば、いくつかはインターフェイス指向です。現在、コードはインターフェイス指向ですか?そうでない場合は、PostSharpの方が適している可能性があります(元のクラスに織り込まれている)。しかし、もちろん、実行時にPostSharpを構成することはできません...コースの馬です。
.NETでアスペクト指向プログラミングを行う最良の方法は、よく知られた設計手法を使用することです。たとえば、 SOLID原則を適用することにより、追加を許可するために必要な柔軟性とモジュール性を実現できます。横断的関心事。デザインの権利があれば、フレームワークなしでほとんどの横断的関心事を適用することさえできます。 OOPがAOPの実行に適していないと考えるのは誤りです。
ここにいくつかのポインタがあります:
- 具体的なインスタンスに依存するのではなく、抽象化に依存します。
- 横断的な関心事とビジネスロジックを同じクラスに混在させないでください。
- それらの懸念を実装するクラスのビジネスロジックでクラスをラップすることによる横断的な懸念の追加(デコレーター)。
- デザイン内の一般的なアーティファクトを見つけて、同じタイプの抽象化を使用して、等しくモデリングします。 this およびこれたとえば。
適切な抽象化ができたら、システムに新しい横断的関心事を追加するのは、新しいデコレータークラスを作成し、適切な実装にラップするだけです。抽象化が一般的な場合、単一のデコレータをクラスの大きなグループにラップできます(これはまさにAOPの目的です)。
動的プロキシやコードウィービングなどの手法により、設計が不適切なアプリケーションでの作業が容易になる場合がありますが、優れた設計に代わるものはありません。遅かれ早かれ、あなたはやけどを負います。ただし、これは動的なプロキシ生成とコードウィービングを使用すべきではないという意味ではありません。ただし、適切なアプリケーション設計がなければ、これらの手法でさえわずかに役立ちます。
最高のことは知りません。フレームワークがたくさんあり、1日ですべてを試すのに十分な時間がありません。
私はPostSharpを使用しましたが、PostSharpを使い始めるのがどれほど簡単であるかに驚きました。
Castle WindsorとSpring.Netを使用したAOPも調べましたが、アプローチは異なります(実行時とコンパイル時)。 AOPとIoCを組み合わせることは理にかなっているようです。これらのフレームワークのいずれかをまだ使用していない場合は、開始するのが非常に多くの作業になりますが、それでやめさせないでください。
新しいプロジェクトの場合は、おそらくCastle Windsorを使用しますが、それは主にIoCも使用したいからです。 AOPを既存のコードベースにすばやく実装する必要がある場合は、PostSharpを使用します。
ポリシーインジェクションと Unity Interception Microsoftから。