使用Ninject的参数化工厂

如何使Ninject在运行时基于变量实例化对象?

我试图在控制器动作中注入正确的存储库 – MVC 3 – 基于来自用户输入的参数。 如果用户输入“BMW”,它会将ICarRepository绑定到BMWRepository ,如果输入“KIA”,则会注入KiaRepository

 [HttpPost] public ActionResult SearchResult(FormCollection values) { string carModel = values["model"]; ICarRepository myRepository = RepositoryFactory.getRepository(carModel); ..... } 

这是通过switch / case noob instantiation或Parameterized Factories已知的,我知道如何在没有Ninject的情况下手动完成,请查看此处介绍的4种方法探索工厂模式

我的问题是如何用Ninject做到这一点?

您可以注入一个抽象工厂 (可能只是一个Func )然后通过将以下内容添加到RegisterServices来实现它:

 Bind().To().Named("KIA") Bind().To().Named("BMW") Bind>() .ToMethod( ctx=> name => ctx.Get( name)); 

在你的ctor:

 class MyController { readonly Func _createRepository; public MyController(Func createRepository) { _createRepository = createRepository; } 

然后,在你的行动中:

 [HttpPost] public ActionResult SearchResult(FormCollection values) { string carModel = values["model"]; using( ICarRepository myRepository = _createRepository( carModel)) { ... } }