使用Ninject的参数化工厂

时间:2012-10-24 20:25:32

标签: c# ninject factory-pattern ninject.web.mvc

如何使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做到这一点?

1 个答案:

答案 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)) 
     {
            ... 
     } 
}