根据this tutorial,要在我的Asp.net MVC 3应用程序中使用Ninject,我要做的就是通过Nuget安装软件包并配置依赖项。
安装Package-Ninject.MVC3
在NinjectMVC3.cs
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IReCaptchaValidator>().To<ReCaptchaValidate>();
}
在Controller
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Registe(RegisterModel model)
{
var myObject = DependencyResolver.Current.GetService<IReCaptchaValidator>(); //always null
}
myObject
始终返回null。
我已经尝试过kernel.Bind<IReCaptchaValidator>().To<ReCaptchaValidate>().InRequestScope()
,但没有效果!
myObject
continues null
在StackOverflow的this post中,有人告诉我使用DependencyResolver.Current.GetService(TYPE)
检索对象的实例。
在您所引用的帖子中,没有告诉您使用DependencyResolver,只是可以使用它。您不应该使用它,因为它是众所周知的反模式。
虽然直接使用DependencyResolver应该可以,但是您实际上不应该那样做。
相反,您应该使用构造函数注入,这将使您的类将类型作为构造函数的参数。
public class MyController : Controller {
IReCaptchaValidator _validator;
public MyController(IReCaptchaValidator validator)
{
_validator = validator;
}
}
然后,在您的方法中:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Registe(RegisterModel model)
{
var myObject = _validator;
}
我有同样的问题。在相同的功能上,我可以很好地解析一个接口,而另一个接口无法解析。他们都已注册!
手动解决时,似乎没有错误!很好笑,但我才发现!
一旦将接口注入控制器构造函数并启用了所有异常,然后我得到一个异常,说我的实现没有公共构造函数!
尝试一下,您很可能会找到根本原因。