使用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)) { ... } }