Разрешение IEnumerable <T> с единицей

Может Единица автоматически решать IEnumerable<T>?

Скажем, у меня есть класс с этим конструктором:

public CoalescingParserSelector(IEnumerable<IParserBuilder> parserBuilders)

и я настраиваю отдельные экземпляры IParserBuilder в контейнере:

container.RegisterType<IParserSelector, CoalescingParserSelector>();
container.RegisterType<IParserBuilder, HelpParserBuilder>();
container.RegisterType<IParserBuilder, SomeOtherParserBuilder>();

я могу сделать эту работу, не имея необходимость реализовывать пользовательскую реализацию IEnumerable<IParserBuilder>?

var selector = container.Resolve<IParserSelector>();

До сих пор я не смог выразить это любым простым способом, но я все еще расту на Единице, таким образом, я, возможно, пропустил что-то.

37
задан Metro Smurf 5 February 2011 в 19:42
поделиться

3 ответа

Я полагаю, что вам нужно будет использовать метод ResolveAll и использовать явный объект InjectionConstructor, т.е. Другими словами, я не думаю, что Unity способен автоматически разрешать все экземпляры типа и знаю, как использовать инъекцию конструктора в класс с параметром IEnumerable без явного объявления объекта InjectionConstructor во время выполнения Run Time.

Конечно, я еще изучаю Unity, но это мой опыт (YMMV).

.
6
ответ дан 27 November 2019 в 04:15
поделиться

@Metro Smurf: ваш ответ направил меня на правильный путь: Unity не может автоматически разрешить зависимости IEnumerable.

Я не смог скомпилировать ваш пример, поскольку метод RegisterType не принимает в качестве параметра экземпляр InjectionConstructor.

Также обратите внимание, что метод ResolveAll будет работать только если вы зарегистрировали несколько типов с разными именами, а также этот метод НЕ возвращает экземпляр для регистрации по умолчанию (без имени). (Я полностью не согласен с таким поведением, кстати).

Вот что сработало у меня:

container.RegisterType<IParserBuilder, HelpParserBuilder>("HelpParserBuilder");
container.RegisterType<IParserBuilder, SomeOtherParserBuilder>("SomeOtherParserBuilder");
container.RegisterType<IParserSelector, CoalescingParserSelector>();

container.Configure<InjectedMembers>().ConfigureInjectionFor<CoalescingParserSelector>(new InjectionConstructor(container.ResolveAll<IParserBuilder>()));

Чтобы разрешить один экземпляр, вам нужно также добавить регистрацию по умолчанию, иначе вызов Resolve() будет неудачным.

Этот код создает регистрацию по умолчанию, чтобы разрешить одиночное разрешение:

container.RegisterType<IParserBuilder, HelpParserBuilder>();
IParserBuilder builder = container.Resolve<IParserBuilder>()
12
ответ дан 27 November 2019 в 04:15
поделиться

По состоянию на май 2010 года для этого есть встроенная поддержка. Посмотрите здесь .

4
ответ дан 27 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: