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

.NET-键控服务依赖注入

有时候我们在服务注册的时候会遇到这样一个场景,我们的同一个接口,有着多个实现,且我们还要同时使用这些实现的时候,这个时候该怎么办?我们可以使用键控服务依赖注入

键控服务依赖注入(Keyed Dependency Injection) 是 .NET 8 引入的新特性,允许你使用键(Key) 来区分同一接口的多个实现,它允许你注册接口的多个实现,每个实现都与一个唯一键相关联,然后基于该键解析所需的实现。

实现

键控服务依赖注入的方式很简单,下面我将从一个例子来说说如何实现
例:我们有一个存储数据的服务,我们既需要存在文件中也需要存在数据库中,这时候我们就会有两个服务的实现

基础类

public interface IDataService
{void SaveData(string data);
}public class LocalDataStorage : IDataService
{public void SaveData(string data){Console.WriteLine("方法1: " + data);}
}public class FileDataStorage : IDataService
{public void SaveData(string data){Console.WriteLine("方法2: " + data);}
}

注册

我们通过名称为不同的实现传入了名称

builder.Services.AddKeyedSingleton<IDataService, LocalDataStorage >("Fun1");
builder.Services.AddKeyedSingleton<IDataService, FileDataStorage >("Fun2");

解析服务

1.构造函数获取

我们可以在构造函数中进行注入,在这里我们需要用到[FromKeyedServices(“名称”))特性来标记需要获取哪个实现。

public class DataController : ControllerBase
{private readonly IDataService dbService;private readonly IDataService fileService;public DataController([FromKeyedServices("Fun1")] IDataService dbService,[FromKeyedServices("Fun2")] IDataService fileService){dbService= dbService;fileService= fileService;}
}

在例子中我们在构造函数中注入了两种实现。

2.通过 IServiceProvider 手动解析

public class MyService
{private readonly IDataService _dbService;public MyService(IServiceProvider serviceProvider){_dbService = serviceProvider.GetRequiredKeyedService<IDataService>("Fun1");}
}

建议

我们在使用键控服务依赖注入时,我们尽量不使用字符串这种硬编码作为KEY名称,建议使用nameof或者枚举作为KEY值进行服务的解析

优势

NET 8键控服务依赖项注入功能弥补了之前版本接口不能多个实现的缺陷。键控服务依赖项注入提供了一种强大的机制来管理和解析接口的多个实现。它允许开发人员根据提供的密钥选择特定的实现,从而实现更灵活、更高效的应用程序设计。

往期推荐

大家如何需要了解依赖注入更详细的内容,可以阅读我之前的文章
.NET依赖注入IOC你了解吗?

http://www.lryc.cn/news/597412.html

相关文章:

  • C 语言基础第9天:一、二维数组
  • 基于Python的新闻爬虫:实时追踪行业动态
  • 网络调制技术对比表
  • 【CNN】模型评估标准
  • 开源新基准!OmniGen2 文本图像对齐度提升 8.6%,视觉一致性超越现有开源模型15%
  • MIPI DSI 转 1LVDS ,分辨率1920*1080.
  • 变频器带动电机:全方位解析参数变化
  • 14. 如何获取用户浏览器内核
  • 【无标题】word 中的中文排序
  • Docker详解及实战
  • Oracle物化视图详解
  • RPA认证考试全攻略:如何高效通过uipath、实在智能等厂商考试
  • InfluxDB HTTP API 接口调用详解(一)
  • 【DataWhale】快乐学习大模型 | 202507,Task06笔记
  • Hexo - 免费搭建个人博客03 - 将个人博客托管到github,个人博客公开给大家访问
  • 深度相机---像素转物理尺寸
  • Paimon的部分更新以及DeleteVector实现
  • 篇四 tcp,udp客户端服务器编程模型
  • MYSQL 笔记3
  • 实验室信息管理系统的设计与实现/实验室管理系统
  • lwIP学习记录5——裸机lwIP工程学习后的总结
  • 【bug】websocket协议不兼容导致的一个奇怪问题
  • Linux 723 磁盘配额 限制用户写入 quota;snap快照原理
  • Linux 环境下安装 MySQL 8.0.34 二进制 详细教程 附docker+k8s启动
  • VU2 学习笔记4 计算属性、监视属性
  • 北京互联网公司面试题精华解析
  • 计算机网络学习----Https协议
  • 直接偏好优化(DPO):原理、演进与大模型对齐新范式
  • python-82-基于ORM操作数据库(一)简单模型CRUD
  • UniappDay01