Есть ли в Castle Windsor статический класс, аналогичный ObjectFactory StructureMap?

В настоящее время я перехожу из StructureMap в Castle Windsor.

Используя StructureMap, вы можете загрузить фреймворк в одном центральном месте, а затем вызвать ObjectFactory.GetInstance в любом месте вашего кода, чтобы получить экземпляр, использующий эту конфигурацию. Итак, концептуально существует единственный контейнер, который вы настраиваете, и вызовы ObjectFactory используют этот контейнер.

В обучающих материалах, которые я видел для Windsor, экземпляр контейнера всегда создается явно, а разрешение происходит через экземпляр этого контейнера. Это просто разница в подходах между двумя фреймворками?

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

(В идеале один вызов Resolve () может быть выполнен после кода конфигурации, и никакие другие ссылки на контейнер не будут существовать; однако есть случаи, когда это невозможно, например, при работе с устаревшей кодовой базой.)


person Phil Sandler    schedule 13.09.2010    source источник


Ответы (3)


Нет. И не будет. Если вы едете со структурной карты в замок Виндзор, прочтите это.

re: как вытащить в более позднюю точку без статического локатора см. это.

person Krzysztof Kozmic    schedule 13.09.2010
comment
Средство Typed Factory потрясающее - долгое время искал решение для контекстно-зависимой конструкции в DI (обычно я просто решаю использовать контейнер). Меня беспокоит то, что теперь я привязываю свой фабричный интерфейс к конкретной сигнатуре конструктора (несмотря на то, что могу реализовать ITypedFactoryComponentSelector). Я могу задать еще один вопрос по этому поводу. Спасибо за Ваш ответ. - person Phil Sandler; 14.09.2010
comment
Аргументы метода никак не связаны с подписью .ctor. Они просто становятся доступными или попадают в область видимости Виндзора, когда он создает объект, но его задача - найти наиболее подходящий конструктор. - person Krzysztof Kozmic; 15.09.2010

Я не знаком с Виндзором, но если у него еще нет своего собственного статического класса фасада, создание собственного класса будет тривиальным делом. Создайте статический класс со статическим свойством, содержащим настроенный контейнер. Добавьте статический метод, который разрешает экземпляры из этого контейнера. Именно это и делает ObjectFactory. В StructureMap есть объект-контейнер, который выполняет всю реальную работу - ObjectFactory - это просто удобная оболочка.

person Joshua Flanagan    schedule 13.09.2010
comment
Да, я подумал об этом. Но SM использует тот же контейнер за кулисами всякий раз, когда используется ObjectFactory. Так, может быть, просто используйте шаблон GOF Singleton, чтобы убедиться, что он только один? В противном случае статический фасад будет создавать новые контейнеры и каждый раз будет вынужден их реконфигурировать, что приведет к потере некоторой поддержки жизненного цикла. - person Phil Sandler; 13.09.2010
comment
Я неправильно понял ваш ответ - теперь я понял. Класс будет по существу глобальным, поэтому он будет делать именно то, что делает ObjectFactory (используя один скрытый контейнер). - person Phil Sandler; 13.09.2010

Если вам это действительно нужно, используйте CommonServiceLocator. Он имеет адаптеры для всех основных контейнеров IoC.

person Mauricio Scheffer    schedule 13.09.2010