如何使Ninject在运行时根据变量实例化对象?
我试图在Controller动作中注入正确的Repository - 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种方法Exploring Factory Pattern
我的问题是如何使用Ninject做到这一点?
答案 0 :(得分:5)
你可以注入一个Abstract Factory(可能只是一个Func<string,ICarRepository>
)然后通过将以下内容添加到RegisterServices
来实现这一切:
Bind<ICarRepository>().To<KiaRepository>().Named("KIA")
Bind<ICarRepository>().To<BmwRepository>().Named("BMW")
Bind<Func<string,ICarRepository>>()
.ToMethod( ctx=> name => ctx.Get<ICarRepository>( name));
在你的ctor中:
class MyController
{
readonly Func<string,ICarRepository> _createRepository;
public MyController(Func<string,ICarRepository> createRepository)
{
_createRepository = createRepository;
}
然后,在你的行动中:
[HttpPost]
public ActionResult SearchResult(FormCollection values)
{
string carModel = values["model"];
using( ICarRepository myRepository = _createRepository( carModel))
{
...
}
}