You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合RegisterManySingleton与命名实例实现依赖注入需求?

问题描述

我希望将基础接口IInitialize的所有已注册实现作为集合注入,同时也能将它们解析为更具体的派生接口(如IServiceOne、IServiceTwo)。为实现集合解析,需将实例注册为命名实例;为支持通过基础或派生接口解析,需使用RegisterManySingleton。是否存在同时满足这两项需求的方法?

示例代码尝试:

containerRegistry.RegisterManySingleton<ServiceOne>(typeof(IInitialize), typeof(IServiceOne), "one");
containerRegistry.RegisterManySingleton<ServiceTwo>(typeof(IInitialize), typeof(IServiceTwo), "two");

相关类型定义:

public interface IInitialize
{
    void Initialize();
}

public interface IServiceOne : IInitialize
{
}

public interface IServiceTwo : IInitialize
{
}

public class Initializer
{
    public Initializer(IInitialize[] services)
    {
        // 需要注入所有IInitialize实现的集合
    }
}

public class Foo
{
    public Foo(IServiceOne service)
    {
        // 需要直接解析IServiceOne实例
    }
}
解决方案

可以通过结合RegisterManySingleton的多服务类型注册与命名标识实现需求。核心思路是:将每个服务类同时注册为派生接口(默认无命名)和基础接口IInitialize(带命名),既支持通过派生接口直接解析实例,也能通过基础接口的命名实例集合完成批量注入。

在Prism的IContainerRegistry中,正确的注册方式如下:

// 注册ServiceOne:同时作为IServiceOne(默认)和命名为"one"的IInitialize单例
containerRegistry.RegisterManySingleton<ServiceOne>(
    serviceTypes: new[] { typeof(IServiceOne), typeof(IInitialize) },
    name: "one");

// 注册ServiceTwo:同时作为IServiceTwo(默认)和命名为"two"的IInitialize单例
containerRegistry.RegisterManySingleton<ServiceTwo>(
    serviceTypes: new[] { typeof(IServiceTwo), typeof(IInitialize) },
    name: "two");

验证场景

  1. 集合注入IInitialize[]:解析Initializer时,容器会自动收集所有注册为IInitialize的实例(包括命名的"one"和"two"),注入到构造函数的数组参数中。
  2. 直接解析派生接口:解析Foo时,容器会直接返回注册为IServiceOne的ServiceOne实例,无需指定名称。

内容的提问来源于stack exchange,提问作者Matus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:03:29