Разрешение реализаций DryIoc serviceKey с использованием фабричного класса

Я пытаюсь создать класс Factory для возврата данной реализации службы на основе служебного ключа Enum.

Мои регистрации:

private static void RegisterPageMap(IRegistrator container)
{
    RegisterPage<SchedulePage>(container, PageKey.Schedule);
    RegisterPage<AccountsPage>(container, PageKey.Accounts);
    RegisterPage<AccountDetailsPage>(container, PageKey.AccountDetails, Reuse.Transient);
    // and more
}

private static void RegisterPage<TPage>(IRegistrator builder, PageKey key) where TPage : Page => RegisterPage<TPage>(builder, key, Reuse.Singleton);

private static void RegisterPage<TPage>(IRegistrator builder, PageKey key, IReuse reuse) where TPage : Page
{
    builder.Register<TPage>(reuse,
                            serviceKey: key,
                            setup: reuse == Reuse.Singleton
                                       ? null
                                       : Setup.With(openResolutionScope: true,
                                                    allowDisposableTransient: true));
}

Класс фабрики предназначен для разрешения всех страниц в конструкторе и сохранения их в резервном поле для будущего использования.

public sealed class PageFactory : IPageFactory
{
    /// <summary>
    /// DryIoc will resolve all keyed pages into the constructor in the format of a <see cref="KeyValuePair{PageKey, Page}"/>
    /// </summary>
    public PageFactory(KeyValuePair<PageKey, Page>[] pages) => _pages = pages;

    /// <inheritdoc cref="IPageFactory"/>
    public Page GetPageForKey(PageKey key) =>
        _pages.First(x => x.Key == key)
              .Value;

    private readonly KeyValuePair<PageKey, Page>[] _pages;
}

Проблема в том, что когда я приземляюсь на линию _pages = pages, вводимое значение имеет Count = 0, и я не уверен, что мне не хватает.

Что мне нужно сделать, чтобы реализовать этот паттерн в DryIoc?


person Chase Florell    schedule 07.06.2020    source источник


Ответы (1)


На первый взгляд, вы регистрируете свои страницы с помощью типа реализации TPage, но разрешаете словарь Page. Вам необходимо изменить регистрацию на container.Register<Page, TPage>(...).

person dadhi    schedule 08.06.2020