nMockとAOP

暫く.NET上でのDIとAOPの実装について調べていたのだけれど当時はAOPの実装といえばJavaの実装の一つであるAspectJの例しか知らなかったので.NETのメッセージシンクを使うタイプや型を動的に生成するタイプのAOP(メッセージインターセプションの機能だけを真のAOPと呼んで良いかどうかは別にして)等いろいろな実装の手法があることが理解できたのは非常に有意義でした。特に動的にアスペクトを処理するタイプのAOP実装はAspectJと違い独自のコンパイラを使う必要がないのは導入の敷居が低く扱い易いことも解りました。

そんなことがあった後にMockの.NET実装の一つでありデファクトと呼んでも良いnMock(http://www.nmock.org/)を試す機会があったのだけれどその時にnMockがどんな技術を使ってモックオブジェクトを実現しているかはすぐに想像できました。というのもMockというのはあるインタフェースのメッセージ(操作)を全てインターセプト(横取り)する必要がある訳で使う側から見てどんなインタフェースにもなりうるモックを生成するためにはAOPと同様のメッセージインターセプションが実装されているに違いないと思ったからです。

実際にnMockのソースコードを見てみたけれどやはり思った通りの実装でした。具体的には以前に日記で紹介した方法と同様であり対象のインタフェースから.NETのIL Emit機能を用いて動的なプロキシ型をモジュール/アセンブリごと生成し、その後リフレクションでインスタンスを生成し、全てのメッセージに対して処理をインターセプトする訳です。内容としては以前に紹介したDynamicProxy(http://www.castleproject.org/index.php/DynamicProxy)からコンストラクタの生成を省いた感じです。

とここで思い出しましたがSesar2のインターセプタの標準実装として提供されているクラスの一つであるMockInterceptorってまんまこいつと同じ考え方でしたね。

少し前までは「あと数年もすればAOPも一般的になるのかな」と思いましたがいろいろと調べて行く内にそれはとんでもない勉強不足であったことが解りました。AOPは既にいろいろなところで実際に使われている訳でこれからの技術でもなんでもなかった訳です。
(そういやMicrosoftはMTSの時代からAOP技術を実用化したと何かに書いてあったっけか※2)

※2:afukuiさんより情報頂きました。出自はEssential .NET ― 共通言語ランタイムの本質ASIN:4891003685でした。