70 lines
3.0 KiB
C#
70 lines
3.0 KiB
C#
using LY.App.Extensions.DI;
|
||
using System.Reflection;
|
||
|
||
namespace LY.App.Extensions
|
||
{
|
||
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)
|
||
.Where(s => !s.ToLower().Contains("sql"))
|
||
.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();
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|