|
|
@ -16,6 +16,7 @@ using Serilog; |
|
|
|
using Serilog.Events; |
|
|
|
using Serilog.Sinks.Grafana.Loki; |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Reflection; |
|
|
|
using System.Runtime.Loader; |
|
|
@ -42,62 +43,103 @@ namespace Gear.Infrastructure.Extensions |
|
|
|
assemblies.Add(typeof(ServiceCollectionServiceExtensions).Assembly); |
|
|
|
} |
|
|
|
|
|
|
|
services.AddLocalServiceLifetime(assemblies); |
|
|
|
|
|
|
|
services.AddHttpContextAccessor(); |
|
|
|
|
|
|
|
services.AddAutoMapper(assemblies); |
|
|
|
|
|
|
|
services.Configure<MvcOptions>(options => |
|
|
|
{ |
|
|
|
options.Conventions.Add(new ApplicationConvention()); |
|
|
|
options.Filters.Add<DefaultApiResponseFilter>(); |
|
|
|
options.Filters.Add<RunParameterActionFilter>(); |
|
|
|
}); |
|
|
|
|
|
|
|
return services; |
|
|
|
} |
|
|
|
|
|
|
|
private static void AddLocalServiceLifetime(this IServiceCollection services, List<Assembly> assemblies) |
|
|
|
{ |
|
|
|
foreach (var assembly in assemblies) |
|
|
|
{ |
|
|
|
var types = assembly.GetTypes(); |
|
|
|
|
|
|
|
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && |
|
|
|
typeof(ITransientDependency) != o && typeof(ITransientDependency).IsAssignableFrom(o))) |
|
|
|
{ |
|
|
|
var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); |
|
|
|
services.AddUses(types); |
|
|
|
|
|
|
|
if (interfaceType != null) |
|
|
|
services.TryAddTransient(interfaceType, type); |
|
|
|
else |
|
|
|
services.TryAddTransient(type, type); |
|
|
|
services.AddTransientDependency(types); |
|
|
|
|
|
|
|
} |
|
|
|
services.AddSingletonDependency(types); |
|
|
|
|
|
|
|
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && |
|
|
|
typeof(ISingletonDependency) != o && typeof(ISingletonDependency).IsAssignableFrom(o))) |
|
|
|
{ |
|
|
|
var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); |
|
|
|
|
|
|
|
if (interfaceType != null) |
|
|
|
services.TryAddSingleton(interfaceType, type); |
|
|
|
else |
|
|
|
services.TryAddSingleton(type, type); |
|
|
|
services.AddScopedDependency(types); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
private static void AddUses(this IServiceCollection services, Type[] types) |
|
|
|
{ |
|
|
|
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && |
|
|
|
!typeof(AppService).IsAssignableFrom(o) && |
|
|
|
typeof(Use) != o && |
|
|
|
typeof(Use).IsAssignableFrom(o))) |
|
|
|
{ |
|
|
|
var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); |
|
|
|
|
|
|
|
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && |
|
|
|
typeof(IScopedDependency) != o && typeof(IScopedDependency).IsAssignableFrom(o))) |
|
|
|
services.TryAddTransient(type, type); |
|
|
|
services.TryAddTransient(interfaceType, o => |
|
|
|
{ |
|
|
|
var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); |
|
|
|
Use use = (Use)o.GetService(type); |
|
|
|
use.LazyServiceProvider = o.GetService<ILazyServiceProvider>(); |
|
|
|
return use; |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (interfaceType != null) |
|
|
|
services.TryAddScoped(interfaceType, type); |
|
|
|
else |
|
|
|
services.TryAddScoped(type, type); |
|
|
|
private static void AddScopedDependency(this IServiceCollection services, Type[] types) |
|
|
|
{ |
|
|
|
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && |
|
|
|
typeof(IScopedDependency) != o && typeof(IScopedDependency).IsAssignableFrom(o))) |
|
|
|
{ |
|
|
|
var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); |
|
|
|
|
|
|
|
} |
|
|
|
if (interfaceType != null) |
|
|
|
services.TryAddScoped(interfaceType, type); |
|
|
|
else |
|
|
|
services.TryAddScoped(type, type); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
services.AddHttpContextAccessor(); |
|
|
|
private static void AddSingletonDependency(this IServiceCollection services, Type[] types) |
|
|
|
{ |
|
|
|
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && |
|
|
|
typeof(ISingletonDependency) != o && typeof(ISingletonDependency).IsAssignableFrom(o))) |
|
|
|
{ |
|
|
|
var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); |
|
|
|
|
|
|
|
services.AddAutoMapper(assemblies); |
|
|
|
if (interfaceType != null) |
|
|
|
services.TryAddSingleton(interfaceType, type); |
|
|
|
else |
|
|
|
services.TryAddSingleton(type, type); |
|
|
|
|
|
|
|
services.Configure<MvcOptions>(options => |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static void AddTransientDependency(this IServiceCollection services, Type[] types) |
|
|
|
{ |
|
|
|
foreach (var type in types.Where(o => !o.IsInterface && !o.IsAbstract && o.IsClass && |
|
|
|
typeof(ITransientDependency) != o && typeof(ITransientDependency).IsAssignableFrom(o))) |
|
|
|
{ |
|
|
|
options.Conventions.Add(new ApplicationConvention()); |
|
|
|
options.Filters.Add<DefaultApiResponseFilter>(); |
|
|
|
options.Filters.Add<RunParameterActionFilter>(); |
|
|
|
}); |
|
|
|
var interfaceType = type.GetInterfaces().FirstOrDefault(interfaceType => interfaceType.Name.EndsWith(type.Name)); |
|
|
|
|
|
|
|
return services; |
|
|
|
if (interfaceType != null) |
|
|
|
services.TryAddTransient(interfaceType, type); |
|
|
|
else |
|
|
|
services.TryAddTransient(type, type); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 对称加密配置
|
|
|
|
/// </summary>
|
|
|
|