Какие еще контейнеры IoC имеют функцию iinitializable like?


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

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

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

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

4 3

4 ответа:

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

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

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

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

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

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

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

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

Линфу.У МОК она есть-называется IInitialize. Вы можете найти его здесь: github.com/philiplaureano/LinFu