Почему Виндзор утверждает, что мой параметр IEnumerable <T>не зарегистрирован? - PullRequest
1 голос
/ 09 августа 2011

У меня есть фабрика, которая принимает в конструкторе IEnumerable<IPredicate>.Моя заводская подпись выглядит следующим образом.

public ServiceFactory(IEnumerable<IPredicate> predicates)

А вот мой код регистрации в Виндзоре.

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel, false));

container.Register(Component
    .For<IServiceFactory>()
    .ImplementedBy<ServiceFactory>());
container.Register(AllTypes.
    FromThisAssembly().
    BasedOn<IPredicate>().
    WithService.AllInterfaces());
container.Register(Component
    .For<IEnumerable<IPredicate>>());

Виндзор вызывает исключение, когда я разрешаю IServiceFactory, потому что он говорит, что я незарегистрированный параметр конструктора predicates.Но, как вы видите, третий компонент, который я регистрирую, говорит о том, что я не зарегистрировался.

Исключение составляет:

Keys (components with specific keys)
- predicates which was not registered.

Чего мне не хватает?

Странно то, что я изначально написал этот код в отдельном проекте и импортировал его в свой производственный проект.Возможно ли, что у меня есть другой установщик, мешающий этому?

Я использую Castle Windsor v2.5.1.0.

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Прочитав мой вопрос 5346 раз, он наконец щелкнул.Тестовый проект, в котором я изначально написал этот код, был простым тестовым проектом.Однако в моем производственном проекте есть несколько разных проектов в одном решении.Вещи, которые я просил Виндзора разрешить, живут в отдельной сборке.Мой установщик велел Windsor зарегистрировать все типы на основе IPredicate из текущей сборки, используя FromThisAssembly().Очевидно, я сказал Виндзору найти вещи, которые он не может найти.

Простым решением было использование FromAssemblyNamed("Your.Assembly.Name").

Так что всегда проверяет, какие сборки вы говоритеВиндзор, чтобы проверить.

2 голосов
/ 10 августа 2011

Ваш другой проект, скорее всего, где-то имеет эту вещь:

var kernel = container.Kernel;

kernel.Resolver.AddSubResolver(new CollectionResolver(kernel));

потому что именно это заставляет Виндзора делать ResolveAll для типа внутри различных типов коллекций, включая IEnumerable<T>.

А затем вы должны удалить вещь container.Register(Component.For<IEnumerable<IPredicate>>()) - эта строка на самом деле ничего не регистрирует, и это может быть причиной того, что распознаватель коллекции не срабатывает.

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