WebActivatorとPreApplicationStartMethodAttribute

MefContrib.MVC3によって生成された、AppStart_MefContribMVC3.csには、MEFを使用するための初期化コードがありますが、このコードは誰が呼び出しているのでしょうか?

[assembly: WebActivator.PreApplicationStartMethod(typeof(TestMvcApplication.App_Start.AppStart_MefContribMVC3), "Start")]

ファイルを覗いてみると上記のようなカスタム属性が見つかります。このWebActivatorがアセンブリの読み込み時に指定されたメソッドを呼び出してくれるのでした。

ところで、.NET4のFCLをチェックしている人なら、System.Web.PreApplicationStartMethodAttributeと同じじゃないの?と疑問に思うかも知れません。違いを確認するために以下のシナリオを考えてみます。

「MEFと同時に他のフレームワークも使用する」
で、NuGetを使って参照を追加すると、App_Startフォルダは以下のようになったとします。

WebActivatorを使わない場合は、この両方のファイルに
[assembly: PreApplicationStartMethod(typeof(AppStart_MefContribMVC), "Run")]
[assembly: PreApplicationStartMethod(typeof(AppStart_FooFramework), "Run")]
が指定されることになるはずです。

・・・が、これ、ビルドエラーになるんですよね。
PreApplicationStartMethodAttributeは1アセンブリに1つしか付けられないの(AllowMultiple=false)・・・

ぶっちゃけ、設計ミスですよね。(^^; もちろん、作った側もそれは認識していて、
Light up your NuGets with startup code and WebActivator – Angle Bracket Percent

The reason is that we were short sighted when we designed this feature in ASP.NET, and only allowed this attribute to be used once per assembly.

先見の明が無かったと率直に言っています。

っということで、NuGetのプロジェクトではPreApplicationStartMethodAttributeの代わりにWebActivatorが使われているという訳でした。