Как регистрировать несколько экземпляров класса в DryIoC?
Использую DryIoC без Prism. Подскажите как регистрировать и затем резолвить несколько экземпляров класса с параметризованным конструктором без обязательного использования serviceKey? Сейчас я это делаю таким образом:
Имеется класс:
class MyClass: IMyInterface
{
public MyClass(MyItem item, ILogger<MyClass> logger = null)
{
...
}
}
Регистрация:
var container = new Container();
...
var id = 0;
foreach (var item in Items)
{
container.RegisterInstance<IMyInterface>(
new MyClass(item,
container.Resolve<ILogger<MyClass>>()),
IfAlreadyRegistered.AppendNewImplementation,
serviceKey: id++);
}
Резолвлю так:
var MyInstances = App.Container.ResolveMany<IMyInterface>(behavior: ResolveManyBehavior.AsFixedArray);
Все работает, но если удалить serviceKey, в MyInstances будет только один элемент. Вероятно таков механизм работы RegisterInstance, и здесь я пользуюсь им не по прямому назначению. Поэтому есть ощущение, что это плохой способ зарегистрировать несколько экземпляров. А существует ли в DryIoC более правильный вариант?
Ответы (2 шт):
Если у тебя разные ключи, то не нужно добавлять IfAlreadyRegistered.AppendNewImplementation,.
Во-первых, у Вас у всегда одна реализация, а именно MyClass - а значит только первая регистрация сработает, а остальные будут отброшены.
Во-вторых, эта опция действуют только когда serviceKey не задан.
Еще скорее всего, не нужно в цикле делать container.Resolve<ILogger<MyClass>>(), чтобы получить один и тот же logger.
Нужно использовать просто RegisterInstance без дополнительных аргументов. То есть:
container.RegisterInstance<IMyInterface>(
new MyClass(item,
container.Resolve<ILogger<MyClass>>()));
Моя ошибка была в том, что я попытался использовать противоречащие друг другу по смыслу аргументы. Если я все верно понял, при использовании IfAlreadyRegistered.AppendNewImplementation будет регистрироваться не новый экземпляр, а именно новая реализация. Если вдобавок к этому указать уникальный serviceKey, то регистрация все же будет производиться каждый раз. Если же требуется каждый раз добавлять новую регистрацию для каждого экземпляра можно указать IfAlreadyRegistered.AppendNotKeyed, но это глупо и не обязательно, т.к. это значение используется по умолчанию.