使用工厂解析 DryIoc serviceKey 实现 class

Resolving DryIoc serviceKey implementations using a factory class

我正在尝试构建工厂 class 以 return 基于枚举服务密钥的给定服务实现。

我的注册:

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));
}

工厂 class 旨在解析构造函数中的所有页面并将它们存储在支持字段中以供将来使用。

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 中实现这个模式?

乍一看,您是通过实现类型 TPage 注册页面,但解析 Page 的字典。 您需要将注册更改为 container.Register<Page, TPage>(...).