Какие еще контейнеры 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 ответа:
Autofac может это сделать - они называют это Startable
С StructureMap вы можете сделать что-то вроде этого:
ForRequestedType<IFoo>() .TheDefaultIsConcreteType<Foo>() .OnCreation(x => x.Init());
Это не так просто, как реализовать интерфейс "инициализации" в вашем классе, но это также означает, что вам не нужно привязывать реализацию класса к вашему выбору контейнера DI, наследуя от конкретного интерфейса контейнера DI (хотя я не уверен, насколько это проблема на самом деле).
Я считаю, что инъекция конструктора гораздо чаще используется прямо сейчас, и инъекция свойств широко рассматривается как запасной вариант для случаев, когда невозможно получить контейнер DI для выполнения строительства объекта для вас (например, ASP.NET webforms). Но тут я могу ошибаться, это просто мое мнение на этот счет!
Вы действительно думаете, что инъекция свойств "Очищает код и довольно много тестирует"? Это интересно, потому что я вроде как думаю обратное - я думаю, что инъекция конструктора "чище", и я предполагаю, что это может быть просто потому, что я обычно так делаю, так что это то, к чему я привык. :)
Замок, возможно, не имел никакого выпуска в течение некоторого времени, но он все еще активно развивается. Вы можете получить последние (довольно стабильные) сборки здесь.
Там также будет официальный релиз v2. 0 довольно скоро. Почему бы не использовать то, что вы уже знаете, если вы знаете, что это хорошо?