Какие другие контейнеры IoC имеют функцию IInitializable? - PullRequest
3 голосов
/ 20 апреля 2009

Я использовал Castle Windsor в моем предыдущем проекте, и мне он очень понравился. Для моего текущего проекта я хочу использовать другой контейнер IoC. У Castle Windsor не было новых выпусков с 2007 года, и он до сих пор не имеет версии 1.0, поэтому его трудно оправдать в коммерческой среде.

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

Я рассматривал StructureMap, AutoFac, Unity и Spring.Net как альтернативы, но из них только Spring.Net поддерживает нечто подобное, он автоматически вызывает метод Init(). К сожалению, Spring.Net на самом деле не поддерживает способ, которым я хочу работать с контейнером IoC (он внедряется на основе строковых ключей вместо объявлений интерфейса, и, следовательно, его поддержка автоматического подключения также ограничена)

Я пропустил похожую функцию в контейнерах IoC, на которые смотрел? Мой способ работы с контейнерами IoC как-то не так? Или есть другие контейнеры IoC, которые поддерживают что-то вроде IInitializable или Init ()?

Ответы [ 4 ]

4 голосов
/ 20 апреля 2009

Autofac может это сделать - они называют это Startable

2 голосов
/ 17 марта 2011

У LinFu.IOC это есть - это называется IInitialize. Вы можете найти его здесь: github.com/philiplaureano/LinFu

2 голосов
/ 21 апреля 2009

У Castle, возможно, еще не было релиза, но он все еще активно развивается. Вы можете получить последние (довольно стабильные) сборки здесь .

Официальный выпуск v2.0 также скоро выйдет. Почему бы не использовать то, что вы уже знаете, если знаете, что это хорошо?

2 голосов
/ 20 апреля 2009

С StructureMap вы можете сделать что-то вроде этого:

ForRequestedType<IFoo>()
  .TheDefaultIsConcreteType<Foo>()
  .OnCreation(x => x.Init());

Это не так просто, как реализовать интерфейс 'Initialisation' для вашего класса, но это также означает, что вам не нужно привязывать реализацию вашего класса к вашему выбору DI-контейнера, наследуя от интерфейса, специфичного для DI-контейнера (хотя я не уверен, насколько серьезна проблема, которая есть на самом деле).

Я полагаю, что внедрение конструктора гораздо чаще используется прямо сейчас, и внедрение свойств широко рассматривается как запасной вариант для случаев, когда не удается заставить DI-контейнер выполнять конструирование объекта для вас (например, веб-формы ASP.NET). , Хотя я могу ошибаться, это мой взгляд на эту тему!

Неужели вы думаете, что внедрение свойства "очищает код и немного тестирует"? Это интересно, потому что я как бы думаю об обратном - я думаю, что инъекция в конструктор «чище», и я предполагаю, что это может быть просто потому, что я обычно делаю это так, к чему я привык. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...