asp.net-mvc - 如何在 Ninject 中创建根据请求的 Controller 而变化的绑定(bind)?

标签 asp.net-mvc dependency-injection ninject asp.net-mvc-4

我有一个 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/

相关文章:

asp.net - 设计一个可单元测试的类

asp.net-mvc - 在MVC4中为ViewModel设置默认值的适当方法?

asp.net - Facebook 评论审核困难

asp.net - 在 SignalR 2.0 中使用现有的 IoC 容器

dependency-injection - AutoMapper TypeConverter 自定义构造函数

.net - 是否有类似 Ninject 提供程序的 Autofac 提供程序?

c# - 另一种管理这种依赖的方法

c# - 如何在 asp.net 表单例份验证中启用多次登录尝试?

javascript - 将对象数组发送到 MVC Controller

java - Bean 实例未加载