【问题标题】:Ninject Dependency Injection on Action Method Parameters in MVC3Ninject MVC3 中 Action 方法参数的依赖注入
【发布时间】:2024-12-09 16:25:01
【问题描述】:

我想使用 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。

【问题讨论】:

  • 出于好奇,为什么需要将它注入到 Action 方法中?为什么不能在控制器上使用构造函数注入?
  • 如果我正在注入对某些服务的依赖项,我可以使用构造函数注入,但我正在尝试在模型上使用 DI,因此我可以从模型的一种实现切换到另一种实现。我现在有点后悔现在的选择。

标签: c# asp.net-mvc-3 ninject ninject.web.mvc


【解决方案1】:

您可能可以实现自己的模型绑定器来执行此操作。

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

【讨论】:

  • 感谢 StanK - 当我对 NInject 鼓励的默认模式更有信心时,我可能会尝试这种方法。
【解决方案2】:

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

【讨论】:

  • 哦,好吧,我要么将我的模型接口包装在另一个类中以实现此行为,要么我将重新安排我的架构以允许在控制器上注入构造函数 - 谢谢。
  • @Nelson,你能看看这个非常相似的问题吗:*.com/questions/29971605/…