.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你了解吗?

相关推荐
guodingdingh2 小时前
软件开发工作问题总结0718
java·开发语言·数据库
优橙教育4 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
SeaTunnel6 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影6 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code7 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121317 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城8 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience9 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao10 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
爱喝水的鱼丶10 小时前
SAP-ABAP:ALV通用封装实践——搭建可复用的ALV开发工具类,减少80%重复代码
开发语言·性能优化·sap·abap·erp·alv