更新项目配置,新增设备同步模块,优化WebSocket和Swagger配置,增强SCADA系统的免登录接口,支持数据字典项和登录日志的免登录查询与记录。调整Java编译设置,确保更好的开发体验。

This commit is contained in:
geht
2026-04-28 10:23:58 +08:00
parent bbe46dcf2d
commit 142a0bdaba
1013 changed files with 41858 additions and 28 deletions

View 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}");
}
}
}
}