Asp.net mvc 3 ModelStateDictionary循环依赖关系-ninject-won';自动绑定

Asp.net mvc 3 ModelStateDictionary循环依赖关系-ninject-won';自动绑定,asp.net-mvc-3,dependency-injection,ninject,Asp.net Mvc 3,Dependency Injection,Ninject,我创建了一个starter MVC 3应用程序设置ninject,并在构造函数中向一个控制器构造函数传递了一个ModelStateDictionary对象。这是System.Web.Mvc命名空间中的对象 使用的隐式自绑定激活ModelStateDictionary时出错 ModelStateDictionary在 两个服务的构造函数 激活路径:3)将依赖项ModelStateDictionary注入到 ModelStateDictionary类型的构造函数的参数字典(字典2) 将依赖关系Mod

我创建了一个starter 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);
    }
}
公共类HomeController:控制器
{
私有只读ModelStateDictionary\u modelDict;
公共家庭控制器(ModelStateDictionary modelDict)
{
_modelDict=modelDict;
}
公共行动结果索引()
{
ViewBag.Message=“欢迎使用ASP.NET MVC!”;
返回视图();
}
}
public void SetupDependencyInjection()
{
IKernel kernel=新的标准内核();
//kernel.Bind().To();
SetResolver(新的NinjectDependencyResolver(内核));
}
公共类NinjectDependencyResolver:IDependencyResolver
{
私有只读IResolutionRoot\u resolutionRoot;
公共NinjectDependencyResolver(IResolutionRoot内核)
{
_resolutionRoot=内核;
}
公共对象GetService(类型serviceType)
{
return _resolutionRoot.TryGet(serviceType);
}
公共IEnumerable GetServices(类型serviceType)
{
return _resolutionRoot.GetAll(serviceType);
}
}

这是一个简单的例子,我没有在我自己的代码中使用这种方式。。。但情况和理论是一样的。ModelStateDictionary应该是隐式自绑定的。Ninject选择接受ModelStateDictionary对象的构造函数,即使存在不接受任何参数的构造函数。如果参数最多的构造函数不能工作,ninject不应该退回到没有参数的构造函数吗?

不,ninject在找到一个没有失败的构造函数之前不会尝试这些构造函数。它选择具有最多绑定参数的构造函数并使用它。如果构造函数失败,则抛出异常。

Kevin Donde,为什么要将ModelStateDictionary作为控制器的参数传递。我认为这是个坏主意。您想直接修改ModelStateDictionary什么?