71 lines
2.9 KiB
C#
71 lines
2.9 KiB
C#
|
|
using System.Reflection;
|
|||
|
|
|
|||
|
|
namespace langguanApi.Extensions.AutoDI
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 自动注入
|
|||
|
|
/// </summary>
|
|||
|
|
public static class AutoDIExtensions
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="serviceCollection"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static IServiceCollection ServicesAutoInjectionExtension(this IServiceCollection serviceCollection)
|
|||
|
|
{
|
|||
|
|
var directory = AppDomain.CurrentDomain.BaseDirectory;
|
|||
|
|
var types = Directory.GetFiles(directory, "*.dll", SearchOption.TopDirectoryOnly)
|
|||
|
|
.Select(Assembly.LoadFrom)
|
|||
|
|
.SelectMany(a => a.GetTypes());
|
|||
|
|
Injection(serviceCollection, types);
|
|||
|
|
return serviceCollection;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 服务自动注入
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="serviceCollection">需要自动注入服务的服务集合</param>
|
|||
|
|
/// <param name="selector">应用于每个Assembly的筛选函数</param>
|
|||
|
|
/// <exception cref="ArgumentOutOfRangeException">指定的注入类型不在可注入的范围内</exception>
|
|||
|
|
/// <exception cref="NoImplementationInterfaceException">指定注入的类型未实现任何服务</exception>
|
|||
|
|
/// <exception cref="ArgumentException">输入的参数错误:1、注入的类型未实现指定的服务。2、指定的服务不是Interface类型</exception>
|
|||
|
|
/// <returns>自动注入服务后的服务集合</returns>
|
|||
|
|
public static IServiceCollection ServicesAutoInjection(this IServiceCollection serviceCollection, Func<Assembly, bool> selector)
|
|||
|
|
{
|
|||
|
|
var directory = AppDomain.CurrentDomain.BaseDirectory;
|
|||
|
|
var types = Directory.GetFiles(directory, "*.dll", SearchOption.TopDirectoryOnly)
|
|||
|
|
.Select(Assembly.LoadFrom)
|
|||
|
|
.Where(selector)
|
|||
|
|
.SelectMany(a => a.GetTypes());
|
|||
|
|
|
|||
|
|
Injection(serviceCollection, types);
|
|||
|
|
|
|||
|
|
return serviceCollection;
|
|||
|
|
}
|
|||
|
|
// 注入逻辑
|
|||
|
|
private static void Injection(IServiceCollection serviceCollection, IEnumerable<Type> types)
|
|||
|
|
{
|
|||
|
|
foreach (var type in types)
|
|||
|
|
{
|
|||
|
|
var attribute = type.GetCustomAttribute<ServiceInjectionAttribute>();
|
|||
|
|
if (attribute == null) continue;
|
|||
|
|
switch (attribute.InjectionType)
|
|||
|
|
{
|
|||
|
|
case InjectionType.Transient:
|
|||
|
|
serviceCollection.AddTransient(type);
|
|||
|
|
break;
|
|||
|
|
case InjectionType.Scoped:
|
|||
|
|
serviceCollection.AddScoped(type);
|
|||
|
|
break;
|
|||
|
|
case InjectionType.Singleton:
|
|||
|
|
serviceCollection.AddSingleton(type);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
throw new ArgumentOutOfRangeException();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|