.NetでのAOPの最適な実装は何ですか?[閉まっている]


83

C#、VB.netには多くのAOP実装があります。これはAOP実装の一部です。

.NetでのAOPの最適な実装は何ですか?何を使うべきですか?


4
読者がGoogleで少し時間を節約できるように、すべてのAOPへのリンクを提供すると便利です。この質問/回答が.NETのさまざまなAOPオプションの優れた要約になることを願っています
Ian Ringrose

10
52人が建設的な質問だと投票しました。5は、建設的ではないと投票しました。誰が決めたの?少なくともモデレーターは質問を変更または再定式化する必要がありますが、ほとんどの人の意見を検討する方がよいでしょう。
2013

2
@Revious完全に同意します!
伝説

1
SOと人々がこのような質問をOTとして反対票を投じることは驚くべきことです。コミュニティについて話し合い、支援するためのこのような有用な質問とテクノロジーは、単純に投票されて閉じられますが、過去に立ち往生している昔ながらの80年代スタイルの人々がたくさんいます。だから、世界は変わった。特定の質問への回答を支援したいが、少なくともそのような質問を投稿するためのリンクを「クローズ」タグに提供することは完全に理解できます。それは大いに役立ち、この種の愚かさを避けるでしょう。
ピクセル

回答:


45

Castle DynamicProxyだと思います動的インターセプトでニーズを処理できる場合は、が最適なソリューションます。このフレームワークは、AOP機能を提供したい他の多くのフレームワークによって内部的に使用されます。通常、既存のIoCコンテナーのほとんどは、動的なインターセプトメカニズム(Spring.NET、Castle Windsor、StructureMapなど)を提供します。すでにIoCコンテナーを使用している場合は、提案内容を確認する方が簡単な場合があります。

動的インターセプトがニーズに対応できない場合(封印されたクラスのウィービング、非仮想呼び出しのインターセプトなど)、静的ウィービングが必要です。PostSharpはこのドメインのリファレンスです。

両方のAOPファッションを活用するために使用できるLinfuも存在することに注意してください。


3
ランタイムAOPを実行したい場合は、それに+1します。コンパイル後のAOPが必要な場合は、PostSharpで+1
Krzysztof Kozmic

この回答に関する更新はありますか?それともこれはまだ有効ですか?Spring.AopがCastleやPostSharpとどのように比較されるのか特に疑問に思っていました
Evren Kuzucuoglu 2011

1
残念ながら、PostSharpは商用製品です
ピクセル

Postsharpは商用製品であり、無料ではありません。静的織りについては他にアドバイスしてください。
シバムサチャン

@ShivamSachan何かが無料だからといって、それが良くなるわけではありません。.netのほとんどの無料AOPは、2〜5年前の最後の更新で死亡しましたが、PostSharpは依然としてクラス最高です。
オフラー

15

「最高」は主観的です。

まず、必要な機能やアーキテクチャなどのリストを作成します。次に、不必要な複雑さを導入することなく、必要なことを実行するオプションを探します。たとえば、いくつかはインターフェース指向です:あなたのコードは現在インターフェース指向ですか?そうでない場合は、PostSharpの方が適している可能性があります(元のクラスに織り込まれています)。しかしもちろん、PostSharpは実行時に構成することはできません...コースの馬。


あなたは次のようにあなたが言ったことを再定式化することができます:「最良は主観的です、私はこのフレームワークのいくつかの賛否両論のリストを作成します」。
2013

11

.NETでアスペクト指向プログラミングを行う最良の方法は、よく知られた設計手法を使用することです。たとえば、SOLIDの原則を適用することで、横断的関心事を追加できるようにするために必要な柔軟性とモジュール性を実現できます。意匠権があれば、フレームワークなしでほとんどの横断的関心事を適用することさえできます。OOPがAOPを行うのに適していないというのは誤りです。

ここにいくつかのポインタがあります:

  • 具体的なインスタンスに依存するのではなく、抽象化に依存します。
  • 横断的関心事とビジネスロジックを同じクラスに混在させないでください。
  • 横断的関心事を実装するクラスのビジネスロジックでクラスをラップすることにより、横断的関心事を追加します(デコレータ)でます。
  • デザインで一般的なアーティファクトを見つけて、できれば同じタイプの抽象化を使用して、それらを等しくモデル化します。たとえば、これこれを見てください。

適切な抽象化が整ったら、システムに新しい横断的関心事を追加するには、新しいデコレータクラスを作成し、それを適切な実装にラップするだけです。抽象化が一般的なものである場合は、単一のデコレータをクラスの大きなグループにラップできます(これがまさにAOPの目的です)。

動的プロキシやコードウィービングなどの手法を使用すると、設計が不適切なアプリケーションでの作業が容易になる可能性がありますが、優れた設計に代わるものはありません。遅かれ早かれあなたはやけどをするでしょう。ただし、これは、動的プロキシ生成とコードウィービングを使用すべきではないという意味ではありません。しかし、適切なアプリケーション設計がなければ、それらの手法でさえわずかに役立つだけです。


AOPは次のレベルの抽象化です。実際、AOPにつながるのは継承と構成の制限です。Entlib例外ブロックを見たことがありますか?アスペクトは、try-catch-log-throwを実行するためだけに、データベースへのすべての呼び出しに対してそのくそブロックを呼び出すよりもはるかにクリーンです。
スリーパースミス

2
データベースへのすべての呼び出しを例外ブロックでラップすると、とにかく間違ったことになります。良いデザインに戻ります。常に。
スティーブン

では、db例外をキャッチする代わりに、正しい方法は何ですか?
OutOFTouch 2013年

2
@OutOFTouch:このSOの質問の答えを見てください。
スティーブン

2
@SleeperSmith:「AOPが次のレベルの抽象化」の意味はわかりませんが、AOPを使用せずに大規模なシステムを保守可能に保つことはできないと思います。私はAOPを適用することを信じています。ただし、AOPはパラダイムです。ツールではありません。継承の制限には同意しますが、AOPにつながるのは構成の制限ではありません。コードウィービングと動的プロキシツールの使用につながるのは、適切な設計の欠如です。デコレータを使用して横断的関心事を適用します。これは、AOPを適用するための私の好ましい方法です。
スティーブン

5

最善の方法はわかりません。フレームワークがたくさんあり、1日ですべてを試すのに十分な時間がありません。

私はPostSharpを使用しましたが、使い始めるのがいかに簡単であるかを嬉しく思いました。

また、Castle WindsorとSpring.Netを使用してAOPを調べましたが、アプローチは異なります(実行時とコンパイル時)。AOPとIoCを混在させることは理にかなっているようです。これらのフレームワークのいずれかをまだ使用していない場合は、開始するのにさらに多くの作業が必要ですが、それで止めないでください。

新しいプロジェクトでは、おそらくCastle Windsorを使用しますが、それは主にIoCも使用したいからです。AOPを既存のコードベースにすばやく実装する必要がある場合は、PostSharpを使用します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.