Как внедрить зависимость в той же процедуре активации из уже разрешенного экземпляра? - PullRequest
1 голос
/ 09 февраля 2012

Я не нашел краткую форму для этого вопроса в качестве темы ...

Можно ли внедрить уже разрешенное свойство экземпляра в конструктор экземпляра зависимости?

Мой вопрос возникает из учебника MVC , созданного в 2009 году. Мне кажется, что это циклическая зависимость.

В любом случае, могу ли я:

  • захватить разрешенное свойство экземпляра ContactController (или его базовый контроллер, листинг 3.) ModelState
  • и внедрить его в свою зависимость ContactService (листинг 4.) экземпляры зависимости ModelStateWrapper (листинг 7.)
  • в качестве аргумента конструктора.

_service = new ContactManagerService(new ModelStateWrapper(this.ModelState)); (после листинга 8.)

Как выполнить вышеприведенную строку с контейнером DI?

Я знаю, что эта проверка, которая происходит в Service Layer, может быть выполнена с аннотациями данных или пользовательскими атрибутами, мой вопрос не столько в дизайне или архитектуре, сколько в возможностях.

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

BR

1 Ответ

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

Нет, вы не можете

Чтобы увидеть проблему, вы должны подумать о порядке, в котором создаются объекты

var modelStateWrapper = new ModelStateWrapper();
var service = new ContactService(modelStateWrapper);
var controller = new ContactController(service);

Это означает, что обертка состояния модели создается задолго до контроллераи, следовательно, невозможно передать состояние модели в конструктор ModelStateWrapper.Единственное, что выполнимо, это где-то использовать Property Injection, но это только обходной путь для реальной проблемы, которая заключается в том, что у вас есть циклическая зависимость.

Реализация также тесно связывает сервис с контроллером.Попробуйте вместо этого использовать ModelValidators.

...