2011-11-17 83 views
1

我想使用NInject.MVC3来解析在控制器上调用Action方法时要实例化的具体类。因此,例如:Ninject MVC3中Action方法参数的依赖注入

[HttpPost] 
    public ActionResult Index(IMyModelInterface model) 
    { 
     // do something 

     return View(); 
    } 

显然没有依赖注入,MVC3不能实例化IMyModelInterface,但我可以说接口绑定到实现该接口的具体类。

我试过这个,只是从试图实例化接口的MVC框架中得到错误。

因此,首先,这是一件不好的事情,试图做?

如果这不是一件愚蠢的事情,我该怎么做?

如果这是一件坏事,我该怎么做。我考虑过使用ViewModel然后复制参数?我稍微不愿意这样做,因为我的模型包含所有视图使用的良好验证属性 - 并且必须在ViewModel中复制它,这似乎增加了维护开销。

我已经看到使用Autofac的doing this的SO问题。

我正在使用来自Nuget包的NInject和NInject.MVC3的最新版本。

+0

出于好奇,你为什么需要将它注入Action方法?为什么不能在控制器上使用构造函数注入? – BFree

+0

我可以使用构造函数注入,如果我注入对某些服务的依赖关系,但我想在模型上使用DI,所以我可以从模型的一个实现切换到另一个。我现在稍微后悔这种选择。 – iandotkelly

回答

3

Ninject不允许您在类似的方法中注入依赖项,因为您可以阅读here
您应该通过控制器的构造函数,属性或setter方法注入您的依赖关系。

+0

噢,我要么将我的模型接口包装在另一个类中以实现此行为,要么重新排列我的架构以允许在控制器上进行构造函数注入 - 谢谢。 – iandotkelly

+0

是的,我认为这是正确的做法。别客气。 –

+0

@Nelson,你可以看看这个非常类似的问题:http://stackoverflow.com/questions/29971605/custom-authorizeattribute-ninject-property-injection-doesnt-work-injected-prop –

4

你可能可以实现你自己的模型绑定器来做到这一点。

子类DefaultModelBinder,覆盖CreateModel并在此方法中使用Ninject返回适当的类型。

+0

感谢StanK - 当我得到更多对NInject鼓励的默认模式充满信心,我可能会尝试这种方法。 – iandotkelly