1

如何让 Ninject 在运行时根据变量实例化对象?

我正在尝试根据来自用户输入的参数在控制器操作 - MVC 3 中注入正确的存储库。如果用户输入“BMW”,它将绑定ICarRepositoryBMWRepository,如果他输入“KIA” KiaRepository,将被注入。

[HttpPost]
public ActionResult SearchResult(FormCollection values)
{
    string carModel  = values["model"];

    ICarRepository myRepository = RepositoryFactory.getRepository(carModel);

    .....
}

这通过 switch/case noob 实例化或参数化工厂知道,我知道如何在没有 Ninject 的情况下手动完成,检查此处解释的 4 种方法Exploring Factory Pattern

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

4

1 回答 1

5

您可以注入一个抽象工厂(可能只是一个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)) 
     {
            ... 
     } 
}
于 2012-10-24T21:46:54.950 回答