ModelStateDictionary循环依赖--ninject不会自绑定

时间:2012-02-27 04:10:01

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

我创建了一个启动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回退到没有参数的构造函数吗?

1 个答案:

答案 0 :(得分:3)

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