DependencyResolver.Current.GetService始终返回null

时间:2011-10-10 23:50:27

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

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

请按照以下步骤

  

安装Package-Ninject.MVC3

NinjectMVC3.cs

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IReCaptchaValidator>().To<ReCaptchaValidate>();
}

控制器

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

myObject始终返回null。

我已经尝试了kernel.Bind<IReCaptchaValidator>().To<ReCaptchaValidate>().InRequestScope(),但没效果!

myObject 继续为空

在StackOverflow上的this post中,我被告知使用DependencyResolver.Current.GetService(TYPE)来检索对象的实例。

2 个答案:

答案 0 :(得分:6)

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

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

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

public class MyController : Controller {
    IReCaptchaValidator _validator;

    public MyController(IReCaptchaValidator validator)
    {
        _validator = validator;
    }
}

然后,在你的方法中:

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult Registe(RegisterModel model)  
{  
    var myObject = _validator;
}  

答案 1 :(得分:0)

我有同样的问题。 在相同的功能上,我可以很好地解析一个接口,而另一个接口无法解析。他们俩都注册了!

手动解决时,似乎没有错误! 很有趣,但是我才发现!

一旦将接口注入控制器构造函数中并启用了所有异常,那么我会得到一个异常,说明我的实现没有公共构造函数!

尝试一下,您很可能会找到根本原因。