ModelStateDictionary Ошибка цикла инъекции циклической зависимости - PullRequest
0 голосов
/ 25 февраля 2012

EDIT

Особая часть, в которой я запутался, - это ошибка.

5) Внедрение зависимости ModelStateDictionary в словарь параметров конструктора типа ModelStateDictionary

ModelStateDictionary имеет конструктор, который принимает объект ModelStateDictionary. Это почему / где происходит ошибка? Если это так, то как мне разрешить это, так как ModelStateDictionary не является объектом n, который я могу напрямую изменить.

Оригинал

Я пытался заставить работать установку внедрения зависимостей для моих контроллеров в приложении asp.net mvc. Но в итоге я получаю циклическую зависимость от System.Web.Mvc.ModelStateDictionary. Я провел некоторые поиски ... здесь и здесь и другие, и я попробовал некоторые из предложений, таких как создание собственности (возможно, я просто не знаю, где разместить их) вместо того, чтобы передавать его через конструктор. Однако мне кажется, что у 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>();

Пожалуйста, дайте мне знать, если я смогу предоставить больше информации ... Сначала я пытался использовать structmap, но не мог заставить DI работать ... Кажется, по крайней мере, я настроил и работал по большей части ninject ,

Спасибо

1 Ответ

1 голос
/ 25 февраля 2012

Ninject выбирает конструктор с большинством параметров, которые он знает, как создать по умолчанию.В этом случае выбирается второй конструктор.Это приведет к переполнению стека, так как для этого потребуется создать ModelStateWrapper для внедрения в ModelStateWrapper и еще одну для вставки во второй, ......

Если только для второго нет веских причинconstrucotr вы должны просто удалить его.В противном случае вы должны предоставить здесь достаточно информации, чтобы мы могли понять, почему существует этот второй конструктор.

...