.NET 8 中的 Keyed Services解锁依赖注入的新方式(最新推荐)

 更新时间:2025年07月22日 09:50:39   作者:t0_54coder  
.NET8引入KeyedServices,允许通过键区分同一接口的不同实现,简化服务选择逻辑,通过注册和注入特性实现灵活依赖管理,提升代码可维护性,但需.NET8及以上版本支持,本文给大家介绍.NET 8 中的 Keyed Services解锁依赖注入的新方式,感兴趣的朋友一起看看吧

在.NET 8 发布之后,依赖注入(Dependency Injection,DI)体系迎来了一个全新的功能——Keyed Services。这篇博客将带你探索如何通过Keyed Services来实现基于特定键选择服务实例的方法。

什么是Keyed Services?

传统的DI容器允许你注册服务,但并没有提供一个简单的方式来区分同一个接口的不同实现。Keyed Services的引入解决了这个问题,它允许你使用键(可以是任何类型,包括字符串、枚举等)来标识不同的服务实例。

如何使用Keyed Services?

让我们以一个具体的示例来展示如何在.NET 8 中使用Keyed Services。

假设我们有一个接口ISampleC,它有两个实现:SampleDSampleE。我们希望根据一个枚举值来选择具体的实现。

首先,定义枚举类型:

public enum ServiceInstanceEnum { SampleE, SampleD }

然后,在Program.csStartup.cs中注册服务:

builder.Services.AddKeyedScoped<ISampleC, SampleD>(ServiceInstanceEnum.SampleD);
builder.Services.AddKeyedScoped<ISampleC, SampleE>(ServiceInstanceEnum.SampleE);

这里,我们使用AddKeyedScoped方法将SampleDSampleE分别与枚举值关联起来。

在控制器中使用

在控制器中注入特定服务实例:

public class WeatherForecastController : Controller
{
    private readonly ISampleC _sampleC;
    public WeatherForecastController(
        ILogger<WeatherForecastController> logger,
        [FromKeyedServices(ServiceInstanceEnum.SampleE)] ISampleC sampleC)
    {
        _logger = logger;
        _sampleC = sampleC;
    }
    // 控制器的其他方法
}

通过[FromKeyedServices]特性,我们可以指定需要注入的ISampleC实例的键值。

好处与限制

  • 好处

    • 更灵活的服务选择方式。
    • 避免了创建工厂方法或手动实例化服务的繁琐。
    • 能够直接利用DI容器管理服务的生命周期。
  • 限制

    • 需要.NET 8 及以上版本。
    • 对于大量键值的管理,可能需要额外的配置和设计考虑。

结论

Keyed Services 是一个强大的工具,它扩展了.NET DI 容器的能力,使得服务的选择和注入变得更加直观和灵活。通过这篇博客的介绍和示例,你应该能够开始在自己的项目中尝试和使用这一新特性。记住,DI 容器不仅仅是用来注入依赖的,它还可以帮助你管理复杂的服务实例选择逻辑,提高代码的可维护性和可测试性。

到此这篇关于.NET 8 中的 Keyed Services:解锁依赖注入的新方式的文章就介绍到这了,更多相关.net Keyed Services依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在SQL Server中使用CLR调用.NET方法实现思路

    在SQL Server中使用CLR调用.NET方法实现思路

    在.NET中新建一个类,并在这个类里新建一个方法,然后在SQL Server中调用这个方法,接下来我们将实现这个功能做了以下几个步骤,详细看下本文,感兴趣的你可不要错过了哈
    2013-02-02
  • .NET C#使用微信公众号登录网站

    .NET C#使用微信公众号登录网站

    这篇文章主要介绍了.NET C#使用微信公众号登录网站,教大家利用微信公众号进行网站登录,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 微信公众号支付(MVC版本)

    微信公众号支付(MVC版本)

    这篇文章主要为大家详细介绍了微信公众号支付,提供MVC版本,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • WPF使用Canvas画布面板布局

    WPF使用Canvas画布面板布局

    这篇文章介绍了WPF使用Canvas画布面板布局的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • asp.net(C#)中上传大文件的几中常见应用方法

    asp.net(C#)中上传大文件的几中常见应用方法

    最近博客需要做一个文件上下载功能,我从网上找了点资料,整理了下希望对大家有帮助!
    2008-11-11
  • 在ASP.NET Core中实现Cookie身份验证的方法步骤

    在ASP.NET Core中实现Cookie身份验证的方法步骤

    ASP.NET Core Identity是一个功能齐全的网站安全框架,它提供了许多特性,例如外部登录和JWT支持,然而,有时您需要的是一种简单易用且能让您完全掌控数据存储和帐户管理等各个方面的解决方案,本文将介绍 Cookie 身份验证的概念以及如何配置它来保护您的网站
    2026-03-03
  • ASP.NET Core2静默获取微信公众号的用户OpenId实例代码

    ASP.NET Core2静默获取微信公众号的用户OpenId实例代码

    这篇文章主要给大家介绍了关于ASP.NET Core2静默获取微信公众号的用户OpenId的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • .Net连接数据库的方式详解

    .Net连接数据库的方式详解

    本文详细讲解了.Net连接数据库的方式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • ASP.NET中GridView、DataList、DataGrid三个数据控件foreach遍历用法示例

    ASP.NET中GridView、DataList、DataGrid三个数据控件foreach遍历用法示例

    这篇文章主要介绍了ASP.NET中GridView、DataList、DataGrid三个数据控件foreach遍历用法,结合实例形式分析了GridView、DataList、DataGrid使用foreach及for语句进行数据遍历的具体使用方法,需要的朋友可以参考下
    2016-08-08
  • VS2013的Browser Link引起的问题

    VS2013的Browser Link引起的问题

    这篇文章主要为大家详细介绍了VS2013的Browser Link引起的问题,以及Browser Link问题的解决方法,感兴趣的小伙伴们可以参考一下
    2016-07-07

最新评论