JiShe.CollectBus/protocols/JiShe.CollectBus.Protocol/JiSheCollectBusProtocolModule.cs

112 lines
5.1 KiB
C#
Raw Normal View History

2025-04-22 16:48:53 +08:00
using JiShe.CollectBus.Kafka.Internal;
using JiShe.CollectBus.Protocol.AnalysisData;
using JiShe.CollectBus.Protocol.Contracts;
2025-04-22 16:48:53 +08:00
using JiShe.CollectBus.Protocol.Contracts.Abstracts;
using JiShe.CollectBus.Protocol.Contracts.Interfaces;
2025-04-24 00:34:00 +08:00
using JiShe.CollectBus.Protocol.Contracts.Models;
using JiShe.CollectBus.Protocol.Dto;
2024-11-13 00:30:24 +08:00
using Microsoft.Extensions.DependencyInjection;
2025-04-22 16:48:53 +08:00
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
2025-04-22 16:48:53 +08:00
using Serilog.Core;
2025-04-24 00:34:00 +08:00
using System;
2025-04-22 16:48:53 +08:00
using System.Reflection;
2024-11-13 00:30:24 +08:00
using Volo.Abp;
using Volo.Abp.Modularity;
namespace JiShe.CollectBus.Protocol
{
public class JiSheCollectBusProtocolModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
2024-12-19 16:07:07 +08:00
context.Services.AddKeyedSingleton<IProtocolPlugin, StandardProtocolPlugin>(nameof(StandardProtocolPlugin));
2025-04-24 00:34:00 +08:00
//RegisterProtocolAnalysis(context.Services);
LoadAnalysisStrategy(context.Services);
2024-11-13 00:30:24 +08:00
}
2025-04-15 17:57:47 +08:00
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
2024-11-13 00:30:24 +08:00
{
2025-04-24 21:01:01 +08:00
Console.WriteLine("StandardProtocolPlugin OnApplicationInitializationAsync");
2024-12-19 16:07:07 +08:00
var standardProtocol = context.ServiceProvider.GetRequiredKeyedService<IProtocolPlugin>(nameof(StandardProtocolPlugin));
await standardProtocol.LoadAsync();
2024-11-13 00:30:24 +08:00
}
2025-04-22 16:48:53 +08:00
2025-04-24 21:01:01 +08:00
public override void OnApplicationShutdown(ApplicationShutdownContext context)
{
Console.WriteLine("StandardProtocolPlugin OnApplicationShutdown");
base.OnApplicationShutdown(context);
}
2025-04-24 00:34:00 +08:00
public void LoadAnalysisStrategy(IServiceCollection services)
{
var assembly = Assembly.GetExecutingAssembly();
var analysisStrategyTypes = assembly.GetTypes().Where(t => !t.IsAbstract && !t.IsInterface && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IAnalysisStrategy<,>)));
foreach (var analysisStrategyType in analysisStrategyTypes)
{
var service = analysisStrategyType.GetInterfaces().First();
services.AddKeyedSingleton(service, analysisStrategyType.Name,analysisStrategyType);
}
}
2025-04-22 16:48:53 +08:00
public void RegisterProtocolAnalysis(IServiceCollection services)
{
// 扫描并注册所有策略
var strategyMetadata = new Dictionary<(string, Type, Type), Type>();
services.AddTransient<AnalysisStrategyContext>();
2025-04-22 16:48:53 +08:00
// 批量注册
var assemblyPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location);
if (string.IsNullOrWhiteSpace(assemblyPath))
{
return;
}
var dllFiles = Directory.GetFiles(Path.Combine(assemblyPath, "Plugins") , "*.dll");
foreach (var file in dllFiles)
{
// 跳过已加载的程序集
var assemblyName = AssemblyName.GetAssemblyName(file);
var existingAssembly = AppDomain.CurrentDomain.GetAssemblies()
.FirstOrDefault(a => a.GetName().FullName == assemblyName.FullName);
var assembly = existingAssembly ?? Assembly.LoadFrom(file);
// 实现IAnalysisStrategy接口
var analysisStrategyTypes = assembly.GetTypes().Where(t => !t.IsAbstract && !t.IsInterface && t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IAnalysisStrategy<,>)));
if (!analysisStrategyTypes.Any())
2025-04-22 16:48:53 +08:00
continue;
foreach (var analysisStrategyType in analysisStrategyTypes)
{
// 通过反射获取静态元数据
var strategyType = analysisStrategyType.Name;
var genericArgs = analysisStrategyType.GetInterface($"IAnalysisStrategy`2")!.GetGenericArguments();
var inputType = genericArgs[0];
var resultType = genericArgs[1];
// 注册策略实现
services.AddTransient(analysisStrategyType);
strategyMetadata[(strategyType, inputType, resultType)] = analysisStrategyType;
2025-04-22 16:48:53 +08:00
}
}
// 注册元数据字典
services.AddSingleton(strategyMetadata);
// 注册策略解析工厂
services.AddTransient<Func<string, Type, Type, object?>>(provider => (name, inputType, resultType) =>
{
var metadata = provider.GetRequiredService<Dictionary<(string, Type, Type), Type>>();
if (metadata.TryGetValue((name, inputType, resultType), out var strategyType))
{
return provider.GetRequiredService(strategyType);
}
else
{
var logger= provider.GetRequiredService<ILogger<AnalysisStrategyContext>>();
logger.LogWarning($"未能找到解析策略:{name}-{inputType}-{resultType}");
return null;
}
});
2025-04-22 16:48:53 +08:00
}
2024-11-13 00:30:24 +08:00
}
}