PostSharp

久しぶりにAOPネタ。

PostSharp - postsharp.org

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/