DependencyInjectionExtensions.cs
6.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using Microsoft.Extensions.DependencyInjection.Extensions;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
namespace Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// 依赖注入拓展类
/// </summary>
internal static class DependencyInjectionExtensions
{
/// <summary>
/// 注册服务(如果服务存在,覆盖注册)
/// </summary>
/// <param name="dependencyType"></param>
/// <param name="collection"></param>
/// <param name="service"></param>
internal static IServiceCollection InnerAdd(this IServiceCollection collection, Type dependencyType, Type service)
{
Call(dependencyType, MethodBase.GetCurrentMethod()
, new object[] { collection, service });
return collection;
}
/// <summary>
/// 注册服务(如果服务存在,覆盖注册)
/// </summary>
/// <param name="dependencyType"></param>
/// <param name="collection"></param>
/// <param name="service"></param>
/// <param name="implementationFactory"></param>
internal static IServiceCollection InnerAdd(this IServiceCollection collection, Type dependencyType, Type service, Func<IServiceProvider, object> implementationFactory)
{
Call(dependencyType, MethodBase.GetCurrentMethod()
, new object[] { collection, service, implementationFactory });
return collection;
}
/// <summary>
/// 注册服务(如果服务存在,覆盖注册)
/// </summary>
/// <param name="dependencyType"></param>
/// <param name="collection"></param>
/// <param name="service"></param>
/// <param name="implementationType"></param>
internal static IServiceCollection InnerAdd(this IServiceCollection collection, Type dependencyType, Type service, Type implementationType)
{
Call(dependencyType, MethodBase.GetCurrentMethod()
, new object[] { collection, service, implementationType });
return collection;
}
/// <summary>
/// 注册服务(如果服务存在,覆盖注册)
/// </summary>
/// <typeparam name="TService"></typeparam>
/// <param name="dependencyType"></param>
/// <param name="collection"></param>
/// <param name="implementationFactory"></param>
internal static IServiceCollection InnerAdd<TService>(this IServiceCollection collection, Type dependencyType, Func<IServiceProvider, TService> implementationFactory)
where TService : class
{
Call(dependencyType, MethodBase.GetCurrentMethod()
, new object[] { collection, implementationFactory }
, new[] { typeof(TService) });
return collection;
}
/// <summary>
/// 注册服务(如果服务存在,跳过注册)
/// </summary>
/// <param name="dependencyType"></param>
/// <param name="collection"></param>
/// <param name="service"></param>
internal static void InnerTryAdd(this IServiceCollection collection, Type dependencyType, Type service)
{
Call(dependencyType, MethodBase.GetCurrentMethod()
, new object[] { collection, service });
}
/// <summary>
/// 注册服务(如果服务存在,跳过注册)
/// </summary>
/// <param name="dependencyType"></param>
/// <param name="collection"></param>
/// <param name="service"></param>
/// <param name="implementationType"></param>
internal static void InnerTryAdd(this IServiceCollection collection, Type dependencyType, Type service, Type implementationType)
{
Call(dependencyType, MethodBase.GetCurrentMethod()
, new object[] { collection, service, implementationType });
}
/// <summary>
/// 反射调用
/// </summary>
/// <param name="dependencyType">dependencyType</param>
/// <param name="currentMethod"></param>
/// <param name="args"></param>
/// <param name="genericArguments"></param>
private static void Call(Type dependencyType, MethodBase currentMethod, object[] args, Type[] genericArguments = default)
{
var tryWay = currentMethod.Name.StartsWith("InnerTry");
var methodName = $"{currentMethod.Name[5..]}{dependencyType.Name[1..]}";
// 获取方法签名(很笨的方式)
var methodSignature = currentMethod.ToString().Replace($"IServiceCollection Inner{(tryWay ? "Try" : string.Empty)}Add", $"IServiceCollection {methodName}")
.Replace("Microsoft.Extensions.DependencyInjection.IServiceCollection, System.Type", "Microsoft.Extensions.DependencyInjection.IServiceCollection");
// 调用静态方法
Invoke(tryWay ? typeof(ServiceCollectionDescriptorExtensions) : typeof(ServiceCollectionServiceExtensions)
, methodSignature
, genericArguments
, args);
}
/// <summary>
/// 反射调用微软内部注册服务方法
/// </summary>
/// <param name="type"></param>
/// <param name="methodSignature"></param>
/// <param name="genericParameters"></param>
/// <param name="args"></param>
private static void Invoke(Type type, string methodSignature, Type[] genericParameters, object[] args = null)
{
var isGeneric = genericParameters != null && genericParameters.Length > 0;
// 查找符合方法签名的方法
var method = type.GetMethods()
.Where(m => m.ToString().Equals(methodSignature))
.FirstOrDefault() ?? throw new InvalidOperationException($"Not found method: {methodSignature}.");
// 处理泛型
var realMethod = method?.IsGenericMethod == true ? method.MakeGenericMethod(genericParameters) : method;
realMethod?.Invoke(null, args ?? Array.Empty<object>());
}
}
}