MVC Web API パイプラインで処理されているIHttpControllerActivator
コントローラーに依存するコントローラーの依存関係を解決できるように、with StructureMapのインターフェイスの実装を構築しようとしています。HttpRequestMessage
私の実装Create
は次のとおりです。
public IHttpController Create(
HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)
{
return (IHttpController)this.Container
.With(request)
.With(controllerDescriptor)
.GetInstance(controllerType);
}
Container
プロパティは、IContainer
構築時にアクティベーターに渡される StructureMap インスタンスへの参照です。
コントローラーの登録では、リフレクションを使用してすべてのApiController
実装を取得します。
foreach(var controller in this.GetType().Assembly.GetTypes()
.Where(type => typeof(ApiController).IsAssignableFrom(type)))
{
this.For(controller).Use(controller);
}
デバッガーを使用して、コントローラー インスタンスを初期化し、それらの依存関係を渡すことを確認しました。ただし、ExecuteAsync
メソッドがコントローラーで呼び出されると、例外がスローされます。
「ApiController」インスタンスを再利用できません。「ApiController」は、着信メッセージごとに構築する必要があります。カスタム 'IHttpControllerActivator' をチェックして、同じインスタンスを作成しないことを確認してください。
掘り下げて実験した後、これは、値が割り当てられているかどうかを確認するために のプロパティExecuteAsync
をチェックする開始時に実行されるチェックによるものであることがわかりました。プロパティの値が null 以外の場合、コントローラーが要求の処理に既に使用されていると推測し、操作を中止します。Request
ApiController
これに加えて、StructureMap がコントローラーの作成時にセッター注入動作を使用しようとしており、Request
null 以外の値を持つ責任があることを確認しました。
私のレジストリでは、setter-injection を構成していないので、なぜここで呼び出されるのか混乱しています。StructureMap API を調べてみても、表示された動作を変更する方法について明確な答えは得られませんでした。
StructureMap を間違って呼び出していますか? 「プロパティ値を決して割り当てない」と言うために活用できる構成設定はありますか?