Как регистрировать несколько экземпляров класса в 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 шт):

Автор решения: dadhi

Если у тебя разные ключи, то не нужно добавлять IfAlreadyRegistered.AppendNewImplementation,. Во-первых, у Вас у всегда одна реализация, а именно MyClass - а значит только первая регистрация сработает, а остальные будут отброшены. Во-вторых, эта опция действуют только когда serviceKey не задан.

Еще скорее всего, не нужно в цикле делать container.Resolve<ILogger<MyClass>>(), чтобы получить один и тот же logger.

→ Ссылка
Автор решения: andreyLv

Нужно использовать просто RegisterInstance без дополнительных аргументов. То есть:

container.RegisterInstance<IMyInterface>(
    new MyClass(item,
    container.Resolve<ILogger<MyClass>>()));

Моя ошибка была в том, что я попытался использовать противоречащие друг другу по смыслу аргументы. Если я все верно понял, при использовании IfAlreadyRegistered.AppendNewImplementation будет регистрироваться не новый экземпляр, а именно новая реализация. Если вдобавок к этому указать уникальный serviceKey, то регистрация все же будет производиться каждый раз. Если же требуется каждый раз добавлять новую регистрацию для каждого экземпляра можно указать IfAlreadyRegistered.AppendNotKeyed, но это глупо и не обязательно, т.к. это значение используется по умолчанию.

→ Ссылка