当前位置: 首页 > news >正文

多实现类(如IService有ServiceA/ServiceB)的注入配置与获取

当一个接口有多个实现时,核心是**“注册时标记区分,获取时指定目标”**,常用两种方式:

1. 方式一:按“命名”注册(.NET 6+推荐,更直观)

注册时给每个实现起“名字”,获取时通过名字指定:
// 1. Program.cs 注册(给ServiceA/ServiceB分别加“标识”)
builder.Services.AddKeyedScoped<IService, ServiceA>("ServiceA"); // 键:"ServiceA"
builder.Services.AddKeyedScoped<IService, ServiceB>("ServiceB"); // 键:"ServiceB"

// 2. 在需要的地方获取(用[FromKeyedServices]指定键)
public class TestController : ControllerBase
{
// 注入ServiceA
private readonly IService _serviceA;
// 注入ServiceB
private readonly IService _serviceB;

    // 构造函数中通过“键”指定获取哪个实现
public TestController(
[FromKeyedServices("ServiceA")] IService serviceA,
[FromKeyedServices("ServiceB")] IService serviceB)
{
_serviceA = serviceA;
_serviceB = serviceB;
}
}
2. 方式二:注入“所有实现”(获取接口的所有实例集合)

如果需要用到该接口的全部实现(比如批量处理),可以直接注入IEnumerable<IService>:
// 1. Program.cs 注册(直接注册所有实现,无需额外标记)
builder.Services.AddScoped<IService, ServiceA>();
builder.Services.AddScoped<IService, ServiceB>();

// 2. 在需要的地方注入“所有实现的集合”
public class TestService
{
// 注入的是IService的所有实现(包含ServiceA和ServiceB)
private readonly IEnumerable<IService> _allServices;

    public TestService(IEnumerable<IService> allServices)
{
_allServices = allServices;
}

    // 使用时遍历集合,按需选择(比如按类型判断)
public void DoWork()
{
foreach (var service in _allServices)
{
if (service is ServiceA)
{
service.DoSomething(); // 调用ServiceA的逻辑
}
else if (service is ServiceB)
{
service.DoSomething(); // 调用ServiceB的逻辑
}
}
}
}

http://www.dtcms.com/a/560925.html

相关文章:

  • web自动化测试-Selenium04_iframe切换、窗口切换
  • 分类与回归算法(一)- 模型评价指标
  • 浙江十大建筑公司排名用v9做网站优化
  • 江门网站建设自助建站站内seo和站外seo区别
  • 嵌入式Linux:线程同步(自旋锁)
  • RHCE复习第一次作业
  • 2025年山西省职业院校技能大赛应用软件系统开发赛项竞赛样题
  • 铁路机车乘务员心理健康状况的研究进展
  • 人才市场官方网站装修公司网站平台
  • Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
  • 【软件安全】什么是AFL(American Fuzzy Lop)基于覆盖率引导的模糊测试工具?
  • 山西省最新干部调整佛山网站建设优化
  • 背包DP合集
  • Docker 拉取镜像:SSL 拦截与国内镜像源失效问题解决
  • full join优化改写经验
  • 软件测试:黑盒测试用例篇
  • 【Linux】Linux第一个小程序 - 进度条
  • ubuntu新增用户
  • 青州市网站建设长沙招聘网58同城招聘发布
  • 江苏中南建设集团网站是多少长沙互联网网站建设
  • 从零开始的云原生之旅(十一):压测实战:验证弹性伸缩效果
  • 民宿网站的建设wordpress gallery
  • 【开题答辩全过程】以 广州网红点打卡介绍网站为例,包含答辩的问题和答案
  • Taro 源码浅析
  • Chart.js 混合图:深度解析与应用技巧
  • redis 大key、热key优化技巧|空间存储优化|调优技巧(一)
  • 监视你的脚本:自动 Linux 活动审计
  • 15.1.2.linux常见操作用例
  • 【Java Web学习 | 第五篇】CSS(4) -盒子模型
  • ubuntu samba 快速安装启用