自动注入类


1、通过序反射获取父类接口

 1 namespace Service.Basic
 2 {
 3     using System;
 4     using System.Linq;
 5     using Microsoft.Extensions.DependencyInjection;
 6 
 7     /// 
 8     /// 自动注入类
 9     /// 
10     public static class AutoDI
11     {
12         /// 
13         /// 注入来源类型下的所有类型
14         /// 
15         /// 服务配置接口
16         /// 接口实现类的类型
17         /// 注入完的服务配置
18         public static IServiceCollection AutoInjection(this IServiceCollection services, Type source)
19         {
20             // 获取实现了接口IDenpendency和IDenpendcySingleton的程序集
21             var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(source)));
22 
23             // class的程序集
24             var implementTypes = allTypes.Where(x => x.IsClass).ToArray();
25 
26             // 接口的程序集
27             var interfaceTypes = allTypes.Where(x => x.IsInterface).ToArray();
28             foreach (var implementType in implementTypes)
29             {
30                 var interfaces = interfaceTypes.Where(x => x.IsAssignableFrom(implementType)).ToList();
31 
32                 foreach (var inter in interfaces)
33                 {
34                     // class有接口,用接口注入
35                     if (inter != null)
36                     {
37                         // 判断用什么方式注入
38                         if (inter.GetInterfaces().Contains(source))
39                         {
40                             services.AddScoped(inter, implementType);
41                         }
42                     }
43                 }
44 
45                 if (implementType.GetInterfaces().Contains(source))
46                 {
47                     services.AddTransient(implementType);
48                 }
49             }
50 
51             return services;
52         }
53     }
54 }

2、定义父类接口

1 /// 
2     /// 通用接口
3     /// 
4     public interface IDenpendency
5     {
6     }

3、父类接口用法

 1     /// 
 2     /// 演示接口
 3     /// 
 4     public interface IDemo : IDenpendency
 5     {
 6         /// 
 7         /// 获取当前时间
 8         /// 
 9         /// 返回当前时间
10         Task GetDateTimeNow();
11     }

4、在程序启动注入父类接口

1             // 自动注入接口/类
2             services.AutoInjection(typeof(IDenpendency));