PostSharp
久しぶりにAOPネタ。
akirameiさんの所で紹介されていた、.NETの主に(※)AOPのためのフレームワーク。
はじめてのPostSharp - 匣の向こう側 - あまりに.NETな
以前ここでも書いたが、.NETにおけるAOPの実装の方法は
.NETプラットホームで可能なAOP実装のまとめ
1.ContextBoundObjectとカスタム属性を用いた方法
2.動的なアセンブリ生成(MSIL Emition)を用いた方法
3.RealProxyを用いた方法
大きくこの3種類が挙げられる。
それぞれの実装を実際に評価してきたが、1.は少し特殊なクラスを継承する必要があり、冗長で実装が面倒なこと、2.はアセンブリを動的に生成する処理が必要であり、これが重い処理であること、アスペクトを適用するためにはvirtual属性が付加されたメソッドが必要なこと、3は.自身への参照(this)を他に渡すことができないこと等、どれも一長一短であり決定打とは言えない部分があった(一番バランスが取れていたのはRealProxyを用いた方法だろう)。
PostSharpによるAOPの実装はこれらの弱点を全て解決してくれるかもしれない。
まだ私もakirameiさんのエントリを読んだ後にドキュメントを眺めてみただけだが、PostSharpはAOPを実装するにあたり
- アスペクトの適用はアノテーション(カスタム属性)により宣言的に行う
- 実際のアスペクトのウィービング(Weaving)をビルド時に行う
というシンプルな手法を提供しており、非常に扱い易い印象がある。特に、MSBuildにビルドフェーズを追加するやり方でアスペクトをウィーブしてしまうのは目から鱗だ。
私も時間が空いたら評価してみて、可能であれば自身のフレームワークのAOP部分に組み込んでみようと思う。
※"主にAOP"と書いたのは、PostSharpは一種の"post-compiler"であり、MSILを出力する最終段に処理を挿入するという意味では、用途はAOPに限らないからだ。-> http://doc.postsharp.org/