ASP.NETMVCコントローラーにサービスを挿入するという異常な状況が発生しました。コントローラは、ページにサイドバーメニューを表示するための単一のアクションを提供し、コントローラに注入されるサービスは、サイドバーコンテンツを作成するためのファクトリです。アクションは[ChildActionOnly]
属性で装飾されています。サイドバーは、別のアクションをレンダリングするときにのみレンダリングできます。
難しいのは、要求されているページ(=コントローラー)に応じて、サイドバーファクトリ抽象化のさまざまなインスタンスを挿入したいということです。以前は、ある種の抽象ファクトリを使用してこれを行っていました。これには、使用する具体的なファクトリ実装を決定するためにコントローラ名文字列を使用するというエレガントでない実装がありました。これを適切な抽象ファクトリに移動したので、ファクトリタイプの選択を別の場所に移動する必要があります。
私のNinjectバインディングは現在、非常に単純に次のように定義されています。
Kernel.Bind<ISideBarFactory>().To<FooSideBarFactory>().InRequestScope();
Kernel.Bind<ISideBarFactory>().To<DefaultSideBarFactory>().InRequestScope();
さらにコントローラーを追加すると、最初の行のインスタンスがさらに追加されます。私がこれが機能することを望んでいる方法は次のとおりです。
/foo/action
リクエストを受け取りました- Ninjectはにバインド
ISideBarFactory
しFooSideBarFactory
、に注入しますSideBarController
- Ninjectはにバインド
/bar/action
リクエストを受け取りました- Ninjectはにバインド
ISideBarFactory
しBarSideBarFactory
、に注入しますSideBarController
- Ninjectはにバインド
/baz/action
リクエストを受け取りました- 存在しない
BazSideBarFactory
ため、NinjectはISideBarFactory
デフォルトの実装にバインドし、DefaultSideBarFactory
に注入しますSideBarController
- 存在しない
ContextualBindingに関するNinjectwikiページを調べましたが、これは原則として私が望んでいるように見えますが、明らかに私の目標を達成する文書は見つかりませんでした。