更新项目配置,新增设备同步模块,优化WebSocket和Swagger配置,增强SCADA系统的免登录接口,支持数据字典项和登录日志的免登录查询与记录。调整Java编译设置,确保更好的开发体验。
This commit is contained in:
109
yy-admin-master/YY.Admin/Module/ServiceExtensions.cs
Normal file
109
yy-admin-master/YY.Admin/Module/ServiceExtensions.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System.Reflection;
|
||||
using YY.Admin.Core;
|
||||
using YY.Admin.Services.Service.Auth;
|
||||
|
||||
namespace YY.Admin
|
||||
{
|
||||
public static class ServiceExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 注册服务
|
||||
/// </summary>
|
||||
public static void AddService(this IContainerRegistry containerRegistry, IConfiguration configuration)
|
||||
{
|
||||
// 注册配置
|
||||
containerRegistry.RegisterInstance<IConfiguration>(configuration);
|
||||
//// 注册日志服务为单例
|
||||
containerRegistry.RegisterSingleton<ILoggerService, SerilogLoggerService>();
|
||||
// 自动扫描并注册应用层服务
|
||||
RegisterServicesByAssembly(containerRegistry, typeof(ISysAuthService).Assembly);
|
||||
}
|
||||
/// <summary>
|
||||
/// 自动注册程序集中所有服务
|
||||
/// </summary>
|
||||
private static void RegisterServicesByAssembly(IContainerRegistry containerRegistry, Assembly assembly)
|
||||
{
|
||||
// 获取所有公开的非抽象类
|
||||
var serviceTypes = assembly.GetExportedTypes()
|
||||
.Where(t => t.IsClass && !t.IsAbstract);
|
||||
|
||||
foreach (var implementationType in serviceTypes)
|
||||
{
|
||||
// 查找服务接口(名称以"I"开头,去掉首字母后匹配)
|
||||
var serviceInterface = implementationType.GetInterfaces()
|
||||
.FirstOrDefault(i => i.Name == $"I{implementationType.Name}");
|
||||
|
||||
// 如果没有直接匹配的接口,尝试查找其他接口
|
||||
if (serviceInterface == null)
|
||||
{
|
||||
// 备选方案1:注册所有实现的接口(适合多接口实现)
|
||||
RegisterAllInterfaces(containerRegistry, implementationType);
|
||||
|
||||
// 备选方案2:只注册主接口
|
||||
// serviceInterface = implementationType.GetInterface($"I{implementationType.Name}");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 注册找到的接口
|
||||
RegisterService(containerRegistry, serviceInterface, implementationType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 注册服务到容器
|
||||
/// </summary>
|
||||
private static void RegisterService(
|
||||
IContainerRegistry containerRegistry,
|
||||
Type serviceType,
|
||||
Type implementationType)
|
||||
{
|
||||
// 根据命名约定判断生命周期
|
||||
bool isSingleton = implementationType.Name.EndsWith("Service") ||
|
||||
implementationType.Name.EndsWith("Repository");
|
||||
|
||||
// 根据基类判断生命周期
|
||||
bool isSingletonByBase = typeof(ISingletonDependency).IsAssignableFrom(implementationType);
|
||||
|
||||
// 根据特性判断生命周期
|
||||
var attribute = implementationType.GetCustomAttribute<LifecycleAttribute>();
|
||||
var lifecycle = attribute?.Lifecycle ?? Lifecycle.Transient;
|
||||
|
||||
// 确定注册方式
|
||||
if (isSingleton || isSingletonByBase || lifecycle == Lifecycle.Singleton)
|
||||
{
|
||||
containerRegistry.RegisterSingleton(serviceType, implementationType);
|
||||
Console.WriteLine($"注册单例服务: {serviceType.Name} -> {implementationType.Name}");
|
||||
}
|
||||
else
|
||||
{
|
||||
containerRegistry.Register(serviceType, implementationType);
|
||||
Console.WriteLine($"注册瞬时服务: {serviceType.Name} -> {implementationType.Name}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 注册所有实现的接口
|
||||
/// </summary>
|
||||
private static void RegisterAllInterfaces(IContainerRegistry containerRegistry, Type implementationType)
|
||||
{
|
||||
var interfaces = implementationType.GetInterfaces()
|
||||
.Where(i => i != typeof(IDisposable) &&
|
||||
!i.Name.StartsWith("_") && // 排除某些特殊接口
|
||||
i.Assembly == implementationType.Assembly); // 只注册同程序集接口
|
||||
|
||||
foreach (var serviceType in interfaces)
|
||||
{
|
||||
RegisterService(containerRegistry, serviceType, implementationType);
|
||||
}
|
||||
|
||||
if (!interfaces.Any())
|
||||
{
|
||||
// 如果没有接口,直接注册具体类型
|
||||
containerRegistry.Register(implementationType);
|
||||
Console.WriteLine($"注册具体类型: {implementationType.Name}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user