依赖注入接口多实现如何获取指定服务

原为链接 https://www.cnblogs.com/ysmc/p/18794061

  在上一个文章中,我们讲过 键控服务 服务,可惜的是这个需要 .NET 8 才能使用,那我们在 .NET 8 之前应该怎么找到我们需要的服务呢,本文给大家讲讲使用特性的方式

  本人依旧秉承着短小精悍,废话不多,直接上代码!

首先,我们写一个特性,自定义特性需要继承 Attribute,并且我们给一个只能 get 的 public 的属性,用于后续获取指定服务使用

public class ServerKeyAttribute : Attribute
{
    public string Key { get; }

    public ServerKeyAttribute(string key)
    {
        Key = key;
    }
}

随便定义一个接口

public interface ITestService
{
    Task GetValue();
}

然后就是多写几个实现,并且使用上面的自定义特性

[ServerKey("Test1")]
public class Test1Service : ITestService
{
    public void GetValue()
    {
        Console.WriteLine("Test1");
    }
}

[ServerKey("Test2")]
public class Test2Service : ITestService
{
    public void GetValue()
    {
        Console.WriteLine("Test2");
    }
}

[ServerKey("Test3")]
public class Test3Service : ITestService
{
    public void GetValue()
    {
        Console.WriteLine("Test3");
    }
}

注册服务

builder.Services.AddTransient<ITestService, Test1Service>();
builder.Services.AddTransient<ITestService, Test2Service>();
builder.Services.AddTransient<ITestService, Test3Service>();

最后我们简单点,在 Controller 中获取指定服务,因为我比较懒

 1 [HttpGet("GetServers")]
 2 public async Task GetServers([FromServices] IEnumerable<ITestService> testServices)
 3 {
 4     foreach (var service in testServices)
 5     {
 6         var attributes = service.GetType().GetCustomAttributes(typeof(ServerKeyAttribute), false) as IEnumerable<ServerKeyAttribute>;
 7         if (attributes != null && attributes.Any())
 8         {
 9             if (attributes.Any(x => x.Key == "Test2"))
10             {
11                 service.GetValue();
12             }
13         }
14     }
15 
16     await Task.CompletedTask;
17 }

结果

好嘞,完事,是不是非常简单,非常感谢各位大佬的观看

来源链接:https://www.cnblogs.com/ysmc/p/18794061

© 版权声明
THE END
支持一下吧
点赞9 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容