Можно ли указать аргументы конструктора переменной длины при регистрации в 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"))));
Другие вопросы по тегам