IWindsorContainer как параметр для класса - PullRequest
7 голосов
/ 23 марта 2009

У меня есть класс, к которому я хочу иметь доступ к своему контейнеру IOC (Windsor), однако я не хочу, чтобы статическое свойство IWindsorContainer оставалось без изменений - я бы предпочел, чтобы контейнер внедрял себя в любые классы, которые требуют IWindsorContainer как зависимость конструктора.

Я выполнил это с Unity, но когда я пытаюсь сделать то же самое с контейнером Windsor, он говорит мне, что IWindsorContainer не зарегистрирован в контейнере.

Я не думаю, что смогу просто зарегистрировать IWindsorContainer => WindsorContainer, потому что это заставит контейнер создавать новый (или другой) свой экземпляр для передачи моему классу, и этот экземпляр не будет иметь все мои другие типы, зарегистрированные с этим. Я также не вижу способа создать контейнер, зарегистрировать все типы в нем, а затем зарегистрировать этот экземпляр самого себя в IWindsorContainer - все методы регистрации принимают только типы для обслуживания и реализации, а не фактический конкретный экземпляр.

Ответы [ 3 ]

8 голосов
/ 23 марта 2009

Как правило, вы не хотите внедрять контейнер в компоненты приложения.

Посмотрите эти вопросы (этот вопрос является почти их дубликатом):

BTW : вы получаете IKernel инъекцию бесплатно, и вы можете зарегистрироваться IWindsorContainer:

container.Register(Component.For<IWindsorContainer>().Instance(container));
1 голос
/ 24 марта 2009

Обычно, как сказал Мауш, подумайте дважды, прежде чем передать свой контейнер компоненту. Вам действительно нужно, чтобы он имел доступ к контейнеру?

Чтобы извлечь зависимости из контейнера, используйте типизированные фабрики .

0 голосов
/ 19 июня 2010

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

В итоге я использовал что-то вроде кода в этой статье: http://mikehadlow.blogspot.com/2010/01/10-advanced-windsor-tricks-1a-delegate.html. Предположим, у вас есть класс, который должен создавать экземпляры IService. В статье описывается метод, позволяющий вашему классу зависеть от Func, и вы автоматически получите фабрику, специфичную для этого класса.

...