From 823be217799d08160ebb355be2bcc6f51a046d69 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Thu, 16 Apr 2026 19:40:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(generator):=20=E6=B7=BB=E5=8A=A0=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E5=8F=91=E7=8E=B0=E5=A4=84=E7=90=86=E5=99=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84=E6=97=A5=E5=BF=97=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 HandlerCandidateAnalysis 结构中新增 RuntimeDiscoveredHandlerInterfaceLogNames 字段 - 为运行时发现的处理器接口创建日志名称收集器并存储显示名称 - 修改构造函数和属性以支持新的日志名称数组字段 - 更新相等性比较逻辑以包含运行时发现接口日志名称的比较 - 在生成的代码中添加注释显示剩余的运行时接口发现目标 - 更新单元测试验证生成的注释内容是否正确包含接口名称 --- .../Cqrs/CqrsHandlerRegistryGeneratorTests.cs | 4 ++ .../Cqrs/CqrsHandlerRegistryGenerator.cs | 46 +++++++++++++++++-- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs b/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs index f51dde95..2e321993 100644 --- a/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs +++ b/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs @@ -932,6 +932,10 @@ public class CqrsHandlerRegistryGeneratorTests generatedSource, Does.Contain( "var knownServiceTypes0 = new global::System.Collections.Generic.HashSet();")); + Assert.That( + generatedSource, + Does.Contain( + "// Remaining runtime interface discovery target: GFramework.Cqrs.Abstractions.Cqrs.IRequestHandler")); Assert.That( generatedSource, Does.Contain( diff --git a/GFramework.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs b/GFramework.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs index 3bd3571d..72ce6664 100644 --- a/GFramework.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs +++ b/GFramework.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs @@ -92,6 +92,8 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator ImmutableArray.CreateBuilder(handlerInterfaces.Length); var preciseReflectedRegistrations = ImmutableArray.CreateBuilder(handlerInterfaces.Length); + var runtimeDiscoveredHandlerInterfaceLogNames = + ImmutableArray.CreateBuilder(handlerInterfaces.Length); var requiresRuntimeInterfaceDiscovery = false; foreach (var handlerInterface in handlerInterfaces) { @@ -128,6 +130,7 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator // 对这些边角场景保留“已知接口静态注册 + 剩余接口运行时补洞”的组合路径, // 避免单个未知接口把同实现上的其它已知注册全部拖回整实现反射发现。 requiresRuntimeInterfaceDiscovery = true; + runtimeDiscoveredHandlerInterfaceLogNames.Add(GetLogDisplayName(handlerInterface)); } return new HandlerCandidateAnalysis( @@ -137,7 +140,8 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator reflectedImplementationRegistrations.ToImmutable(), preciseReflectedRegistrations.ToImmutable(), canReferenceImplementation ? null : GetReflectionTypeMetadataName(type), - requiresRuntimeInterfaceDiscovery); + requiresRuntimeInterfaceDiscovery, + runtimeDiscoveredHandlerInterfaceLogNames.ToImmutable()); } private static void Execute(SourceProductionContext context, GenerationEnvironment generationEnvironment, @@ -182,7 +186,8 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator candidate.ReflectedImplementationRegistrations, candidate.PreciseReflectedRegistrations, candidate.ReflectionTypeMetadataName, - candidate.RequiresRuntimeInterfaceDiscovery)); + candidate.RequiresRuntimeInterfaceDiscovery, + candidate.RuntimeDiscoveredHandlerInterfaceLogNames)); } registrations.Sort(static (left, right) => @@ -655,6 +660,13 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator builder.Append(" var "); builder.Append(knownServiceTypesVariableName); builder.AppendLine(" = new global::System.Collections.Generic.HashSet();"); + foreach (var runtimeDiscoveredHandlerInterfaceLogName in registration + .RuntimeDiscoveredHandlerInterfaceLogNames) + { + builder.Append(" // Remaining runtime interface discovery target: "); + builder.Append(runtimeDiscoveredHandlerInterfaceLogName); + builder.AppendLine(); + } } foreach (var orderedRegistration in orderedRegistrations) @@ -1090,7 +1102,8 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator ImmutableArray ReflectedImplementationRegistrations, ImmutableArray PreciseReflectedRegistrations, string? ReflectionTypeMetadataName, - bool RequiresRuntimeInterfaceDiscovery); + bool RequiresRuntimeInterfaceDiscovery, + ImmutableArray RuntimeDiscoveredHandlerInterfaceLogNames); private readonly struct HandlerCandidateAnalysis : IEquatable { @@ -1101,7 +1114,8 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator ImmutableArray reflectedImplementationRegistrations, ImmutableArray preciseReflectedRegistrations, string? reflectionTypeMetadataName, - bool requiresRuntimeInterfaceDiscovery) + bool requiresRuntimeInterfaceDiscovery, + ImmutableArray runtimeDiscoveredHandlerInterfaceLogNames) { ImplementationTypeDisplayName = implementationTypeDisplayName; ImplementationLogName = implementationLogName; @@ -1110,6 +1124,7 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator PreciseReflectedRegistrations = preciseReflectedRegistrations; ReflectionTypeMetadataName = reflectionTypeMetadataName; RequiresRuntimeInterfaceDiscovery = requiresRuntimeInterfaceDiscovery; + RuntimeDiscoveredHandlerInterfaceLogNames = runtimeDiscoveredHandlerInterfaceLogNames; } public string ImplementationTypeDisplayName { get; } @@ -1126,6 +1141,8 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator public bool RequiresRuntimeInterfaceDiscovery { get; } + public ImmutableArray RuntimeDiscoveredHandlerInterfaceLogNames { get; } + public bool Equals(HandlerCandidateAnalysis other) { if (!string.Equals(ImplementationTypeDisplayName, other.ImplementationTypeDisplayName, @@ -1136,7 +1153,9 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator RequiresRuntimeInterfaceDiscovery != other.RequiresRuntimeInterfaceDiscovery || Registrations.Length != other.Registrations.Length || ReflectedImplementationRegistrations.Length != other.ReflectedImplementationRegistrations.Length || - PreciseReflectedRegistrations.Length != other.PreciseReflectedRegistrations.Length) + PreciseReflectedRegistrations.Length != other.PreciseReflectedRegistrations.Length || + RuntimeDiscoveredHandlerInterfaceLogNames.Length != + other.RuntimeDiscoveredHandlerInterfaceLogNames.Length) { return false; } @@ -1160,6 +1179,17 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator return false; } + for (var index = 0; index < RuntimeDiscoveredHandlerInterfaceLogNames.Length; index++) + { + if (!string.Equals( + RuntimeDiscoveredHandlerInterfaceLogNames[index], + other.RuntimeDiscoveredHandlerInterfaceLogNames[index], + StringComparison.Ordinal)) + { + return false; + } + } + return true; } @@ -1194,6 +1224,12 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator hashCode = (hashCode * 397) ^ preciseReflectedRegistration.GetHashCode(); } + foreach (var runtimeDiscoveredHandlerInterfaceLogName in RuntimeDiscoveredHandlerInterfaceLogNames) + { + hashCode = (hashCode * 397) ^ + StringComparer.Ordinal.GetHashCode(runtimeDiscoveredHandlerInterfaceLogName); + } + return hashCode; } }