ModelStateDictionary循环依赖注入循环错误

时间:2012-02-25 06:35:41

标签: asp.net-mvc dependency-injection

修改

我感到困惑的特殊部分是错误。

5)将依赖ModelStateDictionary注入到ModelStateDictionary类型的构造函数的参数字典中

ModelStateDictionary有一个接受ModelStateDictionary对象的构造函数。这是错误发生的原因吗?如果是这样,我如何解决它,因为ModelStateDictionary不是我可以直接修改的对象。

原始

我一直在尝试让依赖注入设置在asp.net mvc应用程序中为我的控制器工作。但我最终得到了对System.Web.Mvc.ModelStateDictionary的循环依赖。我做了一些搜索... herehere以及其他人,我尝试了一些建议,比如创建一个属性(也许我只是不知道放在哪里)而不是通过构造函数传递它。但是在我看来,ninject遇到了System.Web.Mvc.ModelStateDictionary类或定义的问题。我收到以下错误...

Activation path:
5) Injection of dependency ModelStateDictionary into parameter dictionary of constructor of type ModelStateDictionary
4) Injection of dependency ModelStateDictionary into parameter modelState of constructor of type ModelStateWrapper
3) Injection of dependency IValidationDictionary into parameter validationDictionary of constructor of type ProjectService
2) Injection of dependency IProjectService into parameter prjService of constructor of type ProjectController
1) Request for ProjectController

我的课程定义如下。我显然删除了一些无关紧要的东西......

public class ProjectController : Controller
{
    private IProjectService _prjService;
    private IMembershipService _membershipService;

    public ProjectController(IProjectService prjService,IMembershipService membershipService )
    {
        _membershipService = membershipService;
        _prjService = prjService;
    }

}


public class ProjectService : ServiceBase, IProjectService
{
    public ProjectService(IValidationDictionary validationDictionary) : base(validationDictionary) { }
}


public class ServiceBase
{
    private readonly IValidationDictionary _validationDictionary;

    public IValidationDictionary ValidationDictionary { get { return _validationDictionary; } }

    public ServiceBase(IValidationDictionary validationDictionary)
    {
        _validationDictionary = validationDictionary;
    }

}


public interface IProjectService
{
    // interface has other properties 

    IValidationDictionary ValidationDictionary { get; }
}

public class ModelStateWrapper : IValidationDictionary
{
    private ModelStateDictionary _modelState;

    public ModelStateWrapper(ModelStateDictionary modelState)
    {
        _modelState = modelState;
    }

    public ModelStateWrapper()
    {

    }

    public void AddError(string key, string errorMessage)
    {
        _modelState.AddModelError(key, errorMessage);
    }

    public bool IsValid
    {
        get { return _modelState.IsValid; }
    }
}

ModelStateDictionary的定义如下......至少就我认为它与此问题有关。

[Serializable]
public class ModelStateDictionary : IDictionary<string, ModelState>, ICollection<KeyValuePair<string, ModelState>>, IEnumerable<KeyValuePair<string, ModelState>>, IEnumerable
{
    public ModelStateDictionary();

    public ModelStateDictionary(ModelStateDictionary dictionary);
}

我为ninject设置的绑定如下......

        kernel.Bind<IMembershipService>().To<AuthMembershipService>();
        kernel.Bind<IProjectService>().To<ProjectService>();
        kernel.Bind<IValidationDictionary>().To<ModelStateWrapper>();

如果我能提供更多信息,请告诉我...我最初尝试使用结构图但无法使DI工作......我似乎至少得到了ninject设置并且大部分工作。

谢谢,

1 个答案:

答案 0 :(得分:1)

Ninject选择具有默认情况下知道如何创建的参数最多的构造函数。在这种情况下,选择第二个构造函数。这将导致stackoverflow,因为它必须创建一个ModelStateWrapper来注入ModelStateWrapper,而另外注入第二个,......

除非第二个建构者有充分的理由,否则你应该删除它。否则你必须在这里提供足够的信息,以便我们能够理解为什么有第二个构造函数。