我创建了一个启动MVC 3应用程序设置ninject,并在构造函数中向控制器构造函数传递了一个ModelStateDictionary对象。这是System.Web.Mvc命名空间中的对象。
使用隐式自绑定激活ModelStateDictionary时出错 ModelStateDictionary在。之间检测到循环依赖 两个服务的构造者。
激活路径:3)将依赖ModelStateDictionary注入 ModelStateDictionary类型构造函数的参数字典2) 将依赖ModelStateDictionary注入参数modelDict HomeController类型的构造函数1)HomeController的请求
如何解决此问题?如何以这样的方式抽象它?可能吗?我已经在Stackoverflow和ninject.org上做了一些搜索......但是看不到它是如何应用的,因为我无法直接修改ModelStateDictionary。
public class HomeController : Controller
{
private readonly ModelStateDictionary _modelDict;
public HomeController(ModelStateDictionary modelDict)
{
_modelDict = modelDict;
}
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
}
public void SetupDependencyInjection()
{
IKernel kernel = new StandardKernel();
//kernel.Bind<>().To<>();
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}
public class NinjectDependencyResolver : IDependencyResolver
{
private readonly IResolutionRoot _resolutionRoot;
public NinjectDependencyResolver(IResolutionRoot kernel)
{
_resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
return _resolutionRoot.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _resolutionRoot.GetAll(serviceType);
}
}
这是一个简单的例子,我没有在我自己的代码中使用这种方式......但情况和理论是一样的。 ModelStateDictionary应该是隐式自绑定的。 Ninject选择接受ModelStateDictionary对象的构造函数,即使有一个不接受任何参数的构造函数。如果具有最多参数的构造函数不起作用,不应该ninject回退到没有参数的构造函数吗?
答案 0 :(得分:3)
不,Ninject不会尝试构造函数,直到它找到一个没有失败的构造函数。它选择具有最多参数的构造函数,它具有绑定并使用它。如果构造函数失败,则抛出异常。