Можно ли указать аргументы конструктора переменной длины при регистрации в Unity?
У меня есть интерфейс, IFoo
и три конкретных класса: FooA : IFoo
, FooB : IFoo
, а также MultiFoo : IFoo
,
Конструктор для MultiFoo
выглядит так:
public MultiFoo(params IFoo[] foos) { ... }
Могу ли я указать конкретные переопределения разрешения при регистрации MultiFoo
в единстве? Я хотел бы иметь возможность сделать что-то вроде этого:
container.RegisterType<IFoo, FooA>("Foo A");
container.RegisterType<IFoo, FooB>("Foo B");
container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetime(),
new ResolvedOverride<IFoo>("Foo A"),
new ResolvedOverride<IFoo>("Foo B")
);
который затем передаст разрешенный FooA и разрешенный FooB конструктору во время разрешения:
new MultiFoo(new FooA(), new FooB())
1 ответ
Решение
params
Синтаксический синтаксический компилятор, вы действительно передаете массив как один параметр. Чтобы соответствовать этому, вы должны настроить контейнер следующим образом:
container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetimeManager(),
new InjectionConstructor(new ResolvedArrayParameter<IFoo>(new ResolvedParameter<IFoo>("Foo A"), new ResolvedParameter<IFoo>("Foo B"))));
Переопределения решателя используются во время разрешения, а не во время настройки контейнера. Эквивалент использования переопределений разрешения будет выглядеть так:
container.RegisterType<IFoo, MultiFoo>(new ContainerControlledLifetimeManager());
var foo = container.Resolve<IFoo>(
new ParameterOverride(
"foos",
new ResolvedArrayParameter<IFoo>(new ResolvedParameter<IFoo>("Foo A"), new ResolvedParameter<IFoo>("Foo B"))));