.NET 8 中的 Keyed Services解锁依赖注入的新方式(最新推荐)
作者:t0_54coder
在.NET 8 发布之后,依赖注入(Dependency Injection,DI)体系迎来了一个全新的功能——Keyed Services。这篇博客将带你探索如何通过Keyed Services来实现基于特定键选择服务实例的方法。
什么是Keyed Services?
传统的DI容器允许你注册服务,但并没有提供一个简单的方式来区分同一个接口的不同实现。Keyed Services的引入解决了这个问题,它允许你使用键(可以是任何类型,包括字符串、枚举等)来标识不同的服务实例。
如何使用Keyed Services?
让我们以一个具体的示例来展示如何在.NET 8 中使用Keyed Services。
假设我们有一个接口ISampleC
,它有两个实现:SampleD
和SampleE
。我们希望根据一个枚举值来选择具体的实现。
首先,定义枚举类型:
public enum ServiceInstanceEnum { SampleE, SampleD }
然后,在Program.cs
或Startup.cs
中注册服务:
builder.Services.AddKeyedScoped<ISampleC, SampleD>(ServiceInstanceEnum.SampleD); builder.Services.AddKeyedScoped<ISampleC, SampleE>(ServiceInstanceEnum.SampleE);
这里,我们使用AddKeyedScoped
方法将SampleD
和SampleE
分别与枚举值关联起来。
在控制器中使用
在控制器中注入特定服务实例:
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依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!