【发布时间】:2013-02-11 23:54:46
【问题描述】:
我遇到了一种不寻常的情况,将服务注入 ASP.NET MVC 控制器。 Controller 提供了一个单一的动作来渲染页面上的侧边栏菜单,并且注入到 Controller 中的服务是创建侧边栏内容的工厂。动作用[ChildActionOnly] 属性修饰:只有在渲染另一个动作时才能渲染侧边栏。
困难在于我想根据所请求的页面(= Controller)注入侧栏工厂抽象的不同实例。以前,我使用一种抽象工厂来执行此操作,它使用控制器名称字符串来确定要使用哪个具体工厂实现的不优雅的实现;我现在已将其移至适当的抽象工厂,因此需要将工厂类型的选择移至其他地方。
我的 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
- 不存在
我在Contextual Binding 上查阅了 Ninject wiki 页面,这似乎是我想要的原则上,但我没有发现任何明显实现我的目标的文档。
【问题讨论】:
标签: c# dependency-injection ninject