我有一个 ASP.NET MVC 3 应用程序,并且遇到了以下情况。在我的页面上,我有一个侧栏,其中可以包含特定于该页面的相关链接,即由 Controller 类型确定。链接将由当前页面的内容确定。
我已关注Phil Haack's blog post使用 Html.Action
渲染动态侧边栏和一个单独的 Controller 。我喜欢这种方法给我带来的关注点分离:我的 Controller 根本不知道有关侧边栏的任何信息,而这本来就是应该的方式。
我现在想要注入(inject) SideBar
派生类型的实例进入我的SideBarController
,将调用该操作来渲染侧边栏本身。 SideBar
有一种派生类型每个 Controller ,所以我发现自己想要编写类似于此的代码:
kernel.Bind<SideBar>().ToMethod(_ => controllerName == "foo"
? new FooSideBar(kernel.Get<UrlHelper>())
: new BarSideBar(kernel.Get<UrlHelper>()));
但是该代码片段有很多错误,尤其是我无法获取 lambda 中的 Controller 名称,以及当第三种类型的 Controller 出现时会发生什么的问题,然后是第四个,依此类推。
请注意,我无法使用 WhenInjectedInto<T>()
,如SideBar
实例将始终被注入(inject) SideBarController
。
就其值(value)而言,SideBar
的实例目前是通过 Ninject Factory 扩展创建的,因此相关的侧边栏绑定(bind)如下(我硬绑定(bind)了 SideBar 的实现,只是为了证明到目前为止该方法有效):
kernel.Bind<ISideBarFactory>().ToFactory().InRequestScope();
kernel.Bind<SideBar>().To<FooSideBar>().InRequestScope();
最后,我基本上在 SideBar
的派生类型之间建立了一对一的映射。和 Controller 类型。感觉这里可能有点重复,但它也代表了组件之间的关系,所以我认为我可以接受。
这一切都让我认为我对这部分问题的处理方法是错误的,因此我欢迎有关如何使用 Ninject 实现干净解决方案的建议。
最佳答案
我会尝试回答,但我现在不在电脑旁边,所以它会有点含糊。
从根本上讲,您可以将另一个参数传递给 Html.Action,因此如果该参数是请求或从请求中收集的内容(例如 Controller 名称或 Url 部分),那么您可以使用它来确定要显示哪个侧边栏。您可能需要将工厂注入(inject)侧边栏 Controller ,并使用它来创建正确的 Controller ,或者进行其他一些摆弄,但是一旦您知道需要哪个侧边栏,它就会变得容易得多。
关于asp.net-mvc - 如何在 Ninject 中创建根据请求的 Controller 而变化的绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604502/