我有一个 ASP.NET MVC 3 应用程序,并且遇到了以下情况。在我的页面上,我有一个侧栏,它可以包含特定于该页面的相关链接,即由控制器类型确定。链接将由当前页面的内容决定。
我已经关注了Phil Haack 的关于使用和单独的控制器渲染动态侧边栏的博客文章。Html.Action
我喜欢这种方法给我的关注点分离:我的控制器对侧边栏一无所知,这是应该的方式。
我现在想将派生类型的实例注入SideBar
到 mySideBarController
中,该操作将被调用以呈现侧栏本身。每个控制器都有一种派生类型SideBar
,所以我发现自己想编写类似这样的代码:
kernel.Bind<SideBar>().ToMethod(_ => controllerName == "foo"
? new FooSideBar(kernel.Get<UrlHelper>())
: new BarSideBar(kernel.Get<UrlHelper>()));
但是这段代码有很多错误,尤其是我无法在 lambda 中获取控制器名称这一事实,以及当第三种类型的控制器出现时会发生什么的问题,然后第四等
请注意,我不能使用WhenInjectedInto<T>()
,因为SideBar
实例将始终注入到SideBarController
.
值得一提的SideBar
是,当前正在通过 Ninject Factory 扩展创建 的实例,因此相关的侧边栏绑定如下(我硬绑定了 SideBar 的实现,只是为了证明该方法到目前为止有效):
kernel.Bind<ISideBarFactory>().ToFactory().InRequestScope();
kernel.Bind<SideBar>().To<FooSideBar>().InRequestScope();
SideBar
最后,我基本上在派生类型和控制器类型之间建立了一对一的映射关系。感觉这里可能有点重复,但也代表了组件之间的关系,所以我觉得我可以接受。
这一切都让我觉得我解决这部分问题的方法是错误的,因此我欢迎有关如何使用 Ninject 实现干净解决方案的建议。