パラメータにインターフェイスを使用するときに、AutofacExtensibleActionInvokerがMVCModelBinderと対話する際に問題が発生します。背景は次のとおりです。
私はMVCアプリケーションを構築しており、Autofac MVC3のExtensibleActionInvokerを使用して、アクションのパラメーターとしてサービスを挿入しています。
public ActionResult Test( IMyService service)
{
//A new instance of service is created by Autofac ExtensibleActionInvoker
return View();
}
これは非常にうまく機能し、非常にクリーンなデザインになります(このアプローチの詳細については、 Alex Meyer-Gleavesの投稿を参照してください)。アクション、ビュー、サービス、およびDTOを作成するためのコードジェネレーターを作成しているときにこのメソッドを使用したいと思います。アクションごとのサービスアプローチにより、これが簡単になります。
ただし、HttpPostアクションから入力を受け取る、クラス化されたアクションのパラメーターにもインターフェイスを使用したいと思います。これは、DIを使用して各レイヤーの外部にクラスを作成しているためです。DIを使用してクラスを作成するようにDefaultModelBinderを変更すると(これを行う方法については、MVC3に関するSteve Sandersonの本の595ページを参照)、これは正常に機能します。
[HttpPost]
public ActionResult Test(ITestClass dataComingFromView)
{
//model binder creates the class via DI and then binds it to the data from the post
return View();
}
ただし、上記の簡単な例では、ExtensibleActionInvokerを有効にすると競合が発生します。
- ExtensibleActionInvokerが有効になっていない場合、上記のメソッドは正常に機能します。つまり、拡張DefaultModelBinderはDIを使用してTestClassクラスを作成し、modelbinderはビューからの入力をクラスのフィールドにバインドします。
- ExtensibleActionInvokerを有効にすると、機能しません。つまり、バインディングのない空のTestClassクラスを取得します。ExtensibleActionInvokerがモデルバインダーよりも優先され、空のTestClassクラスを作成するだけだと思います。
- (完全を期すために、MVCを「箱から出して」使用する場合、つまり、新しいDefaultModelBinderとExtensibleActionInvokerが有効になっていない場合、アクションメソッドパラメーターとしてインターフェイスを使用できないと表示されます。)
Autofacの知識が私よりも優れている人への私の質問は、Autofac ExtensibleActionInvokerを変更して、バインド先を選択できるかどうかです。クラス分けされたすべての注入されたサービスはIServiceで始まるので、それでフィルタリングできます。Autofacの他の場所でそれを行うことができることは知っていますが、ExtensibleActionInvokerでそれを行うことはできませんでしたが、おそらく私はそれを見逃しました。
どんな助けでもいただければ幸いです。
JonSmith-選択的分析