Может Единица автоматически решать 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>();
До сих пор я не смог выразить это любым простым способом, но я все еще расту на Единице, таким образом, я, возможно, пропустил что-то.
Я полагаю, что вам нужно будет использовать метод ResolveAll и использовать явный объект InjectionConstructor, т.е. Другими словами, я не думаю, что Unity способен автоматически разрешать все экземпляры типа и знаю, как использовать инъекцию конструктора в класс с параметром IEnumerable без явного объявления объекта InjectionConstructor во время выполнения Run Time.
Конечно, я еще изучаю Unity, но это мой опыт (YMMV).
.@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>()
По состоянию на май 2010 года для этого есть встроенная поддержка. Посмотрите здесь .