.NET-键控服务依赖注入

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

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

实现

键控服务依赖注入的方式很简单,下面我将从一个例子来说说如何实现

例:我们有一个存储数据的服务,我们既需要存在文件中也需要存在数据库中,这时候我们就会有两个服务的实现

基础类

csharp 复制代码
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);
    }
}

注册

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

csharp 复制代码
builder.Services.AddKeyedSingleton<IDataService, LocalDataStorage >("Fun1");
builder.Services.AddKeyedSingleton<IDataService, FileDataStorage >("Fun2");

解析服务

1.构造函数获取

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

csharp 复制代码
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 手动解析

csharp 复制代码
public class MyService
{
    private readonly IDataService _dbService;

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

建议

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

优势

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

往期推荐

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

相关推荐
sleven fung18 小时前
MinerU与BabelDOC与KTransformers与OpenAI API库
开发语言·python·ai·langchain
萤萤七悬18 小时前
【Python笔记】AI帮实现CLI工具-使用argparse.ArgumentParser接收命令参数
开发语言·笔记·python
iCxhust19 小时前
C# 命令行指令 查看二进制文件
开发语言·单片机·嵌入式硬件·c#·proteus·微机原理·8088单板机
csdn_aspnet19 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
诸葛务农19 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
oort12319 小时前
VLStream:全开源决策式AI视频平台,赋能企业构建自主可控、降本增效的智能视觉应用介绍
大数据·开发语言·人工智能·开源·音视频·数据库架构
c2385620 小时前
c/c++中的多态(上)
开发语言·c++
彷徨而立20 小时前
【C++】介绍 std::ifstream 输入文件流
开发语言·c++
罗超驿20 小时前
13.JavaScript 新手入门指南:语法、变量、流程控制全解析
开发语言·javascript
yingjie11020 小时前
Scanpy vs Seurat 深度对比:Python 与 R 的单细胞分析框架谁更强?
开发语言·python·r语言·生物信息学·单细胞转录组·seurat·scanpy