DependencyResolver.Current.GetService始终返回null

rid*_*nsb 8 c# dependency-injection ninject asp.net-mvc-3

根据本教程,要在我的Asp.net MVC 3应用程序中使用Ninject,我所要做的就是通过Nuget安装包并配置依赖项.

跟着这些步骤

安装Package-Ninject.MVC3

NinjectMVC3.cs中

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IReCaptchaValidator>().To<ReCaptchaValidate>();
}
Run Code Online (Sandbox Code Playgroud)

控制器中

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Registe(RegisterModel model)
{
    var myObject = DependencyResolver.Current.GetService<IReCaptchaValidator>(); //always null
}
Run Code Online (Sandbox Code Playgroud)

myObject 始终返回null.

我试过了kernel.Bind<IReCaptchaValidator>().To<ReCaptchaValidate>().InRequestScope(),但效果不好!

myObject 继续为空

这篇关于StackOverflow的帖子中,我被告知要DependencyResolver.Current.GetService(TYPE)用来检索对象的实例.

Eri*_*sch 5

在你引用的帖子中,你没有被告知使用DependencyResolver,只是可以使用它.你不应该使用它,因为它是一个众所周知的反模式.

虽然直接使用DependencyResolver应该可行,但你真的不应该这样做.

相反,您应该使用构造函数注入,这将使您的类将类型作为构造函数的参数.

public class MyController : Controller {
    IReCaptchaValidator _validator;

    public MyController(IReCaptchaValidator validator)
    {
        _validator = validator;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的方法中:

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult Registe(RegisterModel model)  
{  
    var myObject = _validator;
}  
Run Code Online (Sandbox Code Playgroud)

  • 尽管这是选定的答案,我被迫投票,因为它实际上没有回答这个问题.您承认DependencyResolver应该可以工作,但后来解决方法而不是OP当前实现的问题. (4认同)
  • @ErikFunkenbusch问题不在于在MVC网站中使用IOC时的最佳实践。关于DependencyResolver为服务返回NULL。随时回答问题,然后您就可以根据需要添加许多关于良好做法的建议。 (4认同)
  • @RidermandeSousaBarbosa - 虽然如此,但这在很大程度上是无关紧要的.实例化它可能不会产生太多开销.有很多方法可以对此进行微调,但这不值得付出努力. (2认同)
  • @ErikFunkenbusch是的,但是像我这样的人也偶然使用SO,他们偶然遇到相同的问题,但情况不同(在我的情况下,初始化应用程序)。这就是为什么人们应该坚持回答问题,而不是提供其他选择。不赞成投票。 (2认同)
  • 我不同意,也被迫投票。有时可能有一个合理的原因,使这种“肛门模式”成为最可行的选择。在这种情况下,这个问题将无法解决。这是一个很好的选择,但不能回答问题。 (2认同)
  • 我正在寻找所述问题的解决方案,因为我需要解决 Global.asax.cs (我的组合根)中的服务。我实际上无法通过构造函数注入来做到这一点。看到一个非答案作为已接受的答案是令人沮丧的。 (2认同)