在.NET8 中引入了KeyedService
支持,这使得可以支持一对多的依赖注入了。在官方,这个功能叫键化DI服务。
什么是键化DI服务?官方解释是这样的,键化依赖项注入(DI)服务提供了一种适用键来注册和检索DI服务的方法,通过适用键,可以限定注册和使用服务的方式。
看了还是比较懵的话,我们用一个简单的示例来演示一下这个过程。
public interface IOTP{
string OTPType(string type);}public class TOTP : IOTP{
public string OTPType(string type) => "TOTP";}public class HOTP : IOTP{
public string OTPType(string type) => "HOTP";}
builder.Services.AddSingleton<IOTP, TOTP>();builder.Services.AddSingleton<IOTP, HOTP>();
然后再使用的时候,还是比较麻烦的,要么依次取出服务,再进行判断,要么就更改注册的顺序。
现在有了使用Keyed Service
,我们就可以键控服务,进行服务的注册。注册服务时,可以使用AddKeyedSingleton()
、 AddKeyedScoped()
或 AddKeyedTransient()
,进行服务的注册。
builder.Services.AddKeyedSingleton<IOTP, TOTP>("totp");builder.Services.AddKeyedSingleton<IOTP, HOTP>("hotp");
使用的时候,可以通过[FromKeyedServices(object key)]
属性应用服务。例如这样:
public class CreateOTP([FromKeyedServices("totp")] IOTP otp){
public string OTPType(string message) => otp.OTPType(message);}
var app = builder.Build();var totpServie = app.Services.GetRequiredKeyedService<IOTP>("totp");var hotpServie = app.Services.GetRequiredKeyedService<IOTP>("hotp");