ASP.NET MVC 3 アプリがあり、次の状況に遭遇しました。私のページには、そのページに固有の関連リンクを含むことができるサイドバーがあります。つまり、コントローラのタイプによって決定されます。リンクは、現在のページのコンテンツによって決定されます。
私はPhil Haack のブログ投稿に従って、このような動的なサイドバーのレンダリングHtml.Action
と別のコントローラーを使用しました。このアプローチが私に与える関心の分離が好きです。私のコントローラーはサイドバーについて何も知りません。これが本来あるべき姿です。
ここで、サイド バー自体をレンダリングするために呼び出されるアクションであるの派生型のインスタンスSideBar
を myに挿入したいと考えています。SideBarController
コントローラーごとに 1つの派生型があるSideBar
ため、次のようなコードを書きたいと思います。
kernel.Bind<SideBar>().ToMethod(_ => controllerName == "foo"
? new FooSideBar(kernel.Get<UrlHelper>())
: new BarSideBar(kernel.Get<UrlHelper>()));
しかし、そのコードの断片にはかなり多くの間違いがあります。特に、ラムダでコントローラー名を取得できないという事実と、3 番目のタイプのコントローラーが登場したときに何が起こるかという問題です。 4番目など。
インスタンスは常に に注入されるためWhenInjectedInto<T>()
、は使用できないことに注意してください。 SideBar
SideBarController
価値があるのは、のインスタンスSideBar
が現在 Ninject Factory 拡張機能を介して作成されているため、関連するサイド バー バインディングは次のとおりです (これまでのアプローチが機能することを証明するためだけに、SideBar の実装をハード バインドしました)。
kernel.Bind<ISideBarFactory>().ToFactory().InRequestScope();
kernel.Bind<SideBar>().To<FooSideBar>().InRequestScope();
最後に、基本的に、派生型SideBar
とコントローラー型の間に 1 対 1 のマッピングがあります。少し重複しているような気がしますが、コンポーネント間の関係を表しているので、問題ないと思います。
これはすべて、問題のこの部分に対する私のアプローチが間違っていると私に思わせるため、Ninject を使用してクリーンなソリューションを実現する方法についての提案を歓迎します。