From a80ff596317598aff285662ec19141028ef918c4 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:42:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(cqrs):=20=E6=B7=BB=E5=8A=A0CQRS=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E6=A8=A1=E5=9D=97=E5=92=8C=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增ContextAwareMediatorCommandExtensions提供命令扩展方法的兼容性别名 - 新增ContextAwareMediatorExtensions提供CQRS统一接口扩展方法的兼容性别名 - 新增ContextAwareMediatorQueryExtensions提供查询扩展方法的兼容性别名 - 添加CqrsRuntimeModule用于注册CQRS运行时和处理器注册器到依赖注入容器 - 更新IArchitectureContext接口添加新版CQRS请求、命令、查询和通知的统一入口 - 添加架构上下文的CQRS处理器注册相关单元测试 - 配置项目文件以支持多目标框架和包引用管理 --- .../Architectures/IArchitectureContext.cs | 4 +- ...ArchitectureAdditionalCqrsHandlersTests.cs | 2 +- .../ContextAwareMediatorCommandExtensions.cs | 1 + .../ContextAwareMediatorExtensions.cs | 1 + .../ContextAwareMediatorQueryExtensions.cs | 1 + GFramework.Core/GFramework.Core.csproj | 1 + .../Services/Modules/CqrsRuntimeModule.cs | 11 ++-- .../Cqrs/CqrsHandlerRegistrarTests.cs | 1 - .../Command/CommandBase.cs | 2 +- .../CqrsHandlerRegistryAttribute.cs | 2 +- GFramework.Cqrs/CqrsRuntimeFactory.cs | 45 ++++++++++++++++ .../ContextAwareCqrsCommandExtensions.cs | 2 +- .../Extensions/ContextAwareCqrsExtensions.cs | 2 +- .../ContextAwareCqrsQueryExtensions.cs | 2 +- GFramework.Cqrs/GFramework.Cqrs.csproj | 1 + GFramework.Cqrs/GlobalUsings.cs | 6 +++ .../ICqrsHandlerRegistry.cs | 2 +- .../Internal/CqrsDispatcher.cs | 2 +- .../Internal/CqrsHandlerRegistrar.cs | 3 +- .../Internal/DefaultCqrsHandlerRegistrar.cs | 2 +- .../Notification/NotificationBase.cs | 2 +- .../Query/QueryBase.cs | 2 +- .../Request/RequestBase.cs | 2 +- .../ContextAwareCoroutineExtensions.cs | 2 +- .../Constants/PathContests.cs | 12 ++++- .../Cqrs/CqrsHandlerRegistryGeneratorTests.cs | 30 ++++++----- .../Cqrs/CqrsHandlerRegistryGenerator.cs | 20 +++++--- GFramework.Tests.Common/CqrsTestRuntime.cs | 51 ++++--------------- .../GFramework.Tests.Common.csproj | 1 + 29 files changed, 129 insertions(+), 86 deletions(-) rename {GFramework.Core/Cqrs => GFramework.Cqrs}/Command/CommandBase.cs (97%) rename {GFramework.Core.Abstractions/Cqrs => GFramework.Cqrs}/CqrsHandlerRegistryAttribute.cs (94%) create mode 100644 GFramework.Cqrs/CqrsRuntimeFactory.cs rename {GFramework.Core => GFramework.Cqrs}/Extensions/ContextAwareCqrsCommandExtensions.cs (98%) rename {GFramework.Core => GFramework.Cqrs}/Extensions/ContextAwareCqrsExtensions.cs (99%) rename {GFramework.Core => GFramework.Cqrs}/Extensions/ContextAwareCqrsQueryExtensions.cs (98%) create mode 100644 GFramework.Cqrs/GlobalUsings.cs rename {GFramework.Core.Abstractions/Cqrs => GFramework.Cqrs}/ICqrsHandlerRegistry.cs (95%) rename {GFramework.Core/Cqrs => GFramework.Cqrs}/Internal/CqrsDispatcher.cs (99%) rename {GFramework.Core/Cqrs => GFramework.Cqrs}/Internal/CqrsHandlerRegistrar.cs (99%) rename {GFramework.Core/Cqrs => GFramework.Cqrs}/Internal/DefaultCqrsHandlerRegistrar.cs (96%) rename {GFramework.Core/Cqrs => GFramework.Cqrs}/Notification/NotificationBase.cs (96%) rename {GFramework.Core/Cqrs => GFramework.Cqrs}/Query/QueryBase.cs (97%) rename {GFramework.Core/Cqrs => GFramework.Cqrs}/Request/RequestBase.cs (97%) diff --git a/GFramework.Core.Abstractions/Architectures/IArchitectureContext.cs b/GFramework.Core.Abstractions/Architectures/IArchitectureContext.cs index 0eb6a43f..c7b62e2f 100644 --- a/GFramework.Core.Abstractions/Architectures/IArchitectureContext.cs +++ b/GFramework.Core.Abstractions/Architectures/IArchitectureContext.cs @@ -15,7 +15,7 @@ namespace GFramework.Core.Abstractions.Architectures; /// /// /// 旧的 GFramework.Core.Abstractions.CommandGFramework.Core.Abstractions.Query 契约会继续通过原有 Command/Query Executor 路径执行,以保证存量代码兼容。 -/// 新的 GFramework.Core.Abstractions.Cqrs 契约由内置 CQRS dispatcher 统一处理,支持 request pipeline、notification publish 与 stream request。 +/// 新的 GFramework.Cqrs.Abstractions.Cqrs 契约由内置 CQRS dispatcher 统一处理,支持 request pipeline、notification publish 与 stream request。 /// 新功能优先使用 与对应的 CQRS Command/Query 重载;迁移旧代码时可先保留旧入口,再逐步替换为 CQRS 请求模型。 /// public interface IArchitectureContext @@ -175,7 +175,7 @@ public interface IArchitectureContext /// 要发送的 CQRS 查询。 /// 查询结果。 /// - /// 这是迁移后的推荐查询入口。新查询应优先实现 GFramework.Core.Abstractions.Cqrs.Query.IQuery<TResponse>。 + /// 这是迁移后的推荐查询入口。新查询应优先实现 GFramework.Cqrs.Abstractions.Cqrs.Query.IQuery<TResponse>。 /// TResponse SendQuery(GFramework.Cqrs.Abstractions.Cqrs.Query.IQuery query); diff --git a/GFramework.Core.Tests/Architectures/ArchitectureAdditionalCqrsHandlersTests.cs b/GFramework.Core.Tests/Architectures/ArchitectureAdditionalCqrsHandlersTests.cs index 67255b41..ddec08c8 100644 --- a/GFramework.Core.Tests/Architectures/ArchitectureAdditionalCqrsHandlersTests.cs +++ b/GFramework.Core.Tests/Architectures/ArchitectureAdditionalCqrsHandlersTests.cs @@ -1,8 +1,8 @@ using System.Reflection; -using GFramework.Core.Abstractions.Cqrs; using GFramework.Core.Abstractions.Logging; using GFramework.Core.Architectures; using GFramework.Core.Logging; +using GFramework.Cqrs; using GFramework.Cqrs.Abstractions.Cqrs; namespace GFramework.Core.Tests.Architectures; diff --git a/GFramework.Core/Extensions/ContextAwareMediatorCommandExtensions.cs b/GFramework.Core/Extensions/ContextAwareMediatorCommandExtensions.cs index 4ab0692b..d001cb71 100644 --- a/GFramework.Core/Extensions/ContextAwareMediatorCommandExtensions.cs +++ b/GFramework.Core/Extensions/ContextAwareMediatorCommandExtensions.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using GFramework.Core.Abstractions.Rule; using GFramework.Cqrs.Abstractions.Cqrs.Command; +using GFramework.Cqrs.Extensions; namespace GFramework.Core.Extensions; diff --git a/GFramework.Core/Extensions/ContextAwareMediatorExtensions.cs b/GFramework.Core/Extensions/ContextAwareMediatorExtensions.cs index f2294930..c7aec1b6 100644 --- a/GFramework.Core/Extensions/ContextAwareMediatorExtensions.cs +++ b/GFramework.Core/Extensions/ContextAwareMediatorExtensions.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using GFramework.Core.Abstractions.Rule; using GFramework.Cqrs.Abstractions.Cqrs; +using GFramework.Cqrs.Extensions; namespace GFramework.Core.Extensions; diff --git a/GFramework.Core/Extensions/ContextAwareMediatorQueryExtensions.cs b/GFramework.Core/Extensions/ContextAwareMediatorQueryExtensions.cs index 61b02cb9..4eb1b2c7 100644 --- a/GFramework.Core/Extensions/ContextAwareMediatorQueryExtensions.cs +++ b/GFramework.Core/Extensions/ContextAwareMediatorQueryExtensions.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using GFramework.Core.Abstractions.Rule; using GFramework.Cqrs.Abstractions.Cqrs.Query; +using GFramework.Cqrs.Extensions; namespace GFramework.Core.Extensions; diff --git a/GFramework.Core/GFramework.Core.csproj b/GFramework.Core/GFramework.Core.csproj index f3e41eab..2535d4e9 100644 --- a/GFramework.Core/GFramework.Core.csproj +++ b/GFramework.Core/GFramework.Core.csproj @@ -10,6 +10,7 @@ + diff --git a/GFramework.Core/Services/Modules/CqrsRuntimeModule.cs b/GFramework.Core/Services/Modules/CqrsRuntimeModule.cs index 5ca7a909..9e7ad307 100644 --- a/GFramework.Core/Services/Modules/CqrsRuntimeModule.cs +++ b/GFramework.Core/Services/Modules/CqrsRuntimeModule.cs @@ -1,8 +1,8 @@ using GFramework.Core.Abstractions.Architectures; using GFramework.Core.Abstractions.Cqrs; using GFramework.Core.Abstractions.Ioc; -using GFramework.Core.Cqrs.Internal; using GFramework.Core.Logging; +using GFramework.Cqrs; using GFramework.Cqrs.Abstractions.Cqrs; namespace GFramework.Core.Services.Modules; @@ -37,11 +37,12 @@ public sealed class CqrsRuntimeModule : IServiceModule { ArgumentNullException.ThrowIfNull(container); - var dispatcherLogger = LoggerFactoryResolver.Provider.CreateLogger(nameof(CqrsDispatcher)); - var registrarLogger = LoggerFactoryResolver.Provider.CreateLogger(nameof(DefaultCqrsHandlerRegistrar)); + var dispatcherLogger = LoggerFactoryResolver.Provider.CreateLogger("CqrsDispatcher"); + var registrarLogger = LoggerFactoryResolver.Provider.CreateLogger("DefaultCqrsHandlerRegistrar"); - container.Register(new CqrsDispatcher(container, dispatcherLogger)); - container.Register(new DefaultCqrsHandlerRegistrar(container, registrarLogger)); + container.Register(CqrsRuntimeFactory.CreateRuntime(container, dispatcherLogger)); + container.Register( + CqrsRuntimeFactory.CreateHandlerRegistrar(container, registrarLogger)); } /// diff --git a/GFramework.Cqrs.Tests/Cqrs/CqrsHandlerRegistrarTests.cs b/GFramework.Cqrs.Tests/Cqrs/CqrsHandlerRegistrarTests.cs index 360fe97b..3100ce84 100644 --- a/GFramework.Cqrs.Tests/Cqrs/CqrsHandlerRegistrarTests.cs +++ b/GFramework.Cqrs.Tests/Cqrs/CqrsHandlerRegistrarTests.cs @@ -1,4 +1,3 @@ -using GFramework.Core.Abstractions.Cqrs; using GFramework.Core.Abstractions.Logging; using GFramework.Core.Architectures; using GFramework.Core.Ioc; diff --git a/GFramework.Core/Cqrs/Command/CommandBase.cs b/GFramework.Cqrs/Command/CommandBase.cs similarity index 97% rename from GFramework.Core/Cqrs/Command/CommandBase.cs rename to GFramework.Cqrs/Command/CommandBase.cs index d8232608..57703c47 100644 --- a/GFramework.Core/Cqrs/Command/CommandBase.cs +++ b/GFramework.Cqrs/Command/CommandBase.cs @@ -13,7 +13,7 @@ using GFramework.Cqrs.Abstractions.Cqrs.Command; -namespace GFramework.Core.Cqrs.Command; +namespace GFramework.Cqrs.Command; /// /// 表示一个基础命令类,用于处理带有输入和响应的命令模式实现。 diff --git a/GFramework.Core.Abstractions/Cqrs/CqrsHandlerRegistryAttribute.cs b/GFramework.Cqrs/CqrsHandlerRegistryAttribute.cs similarity index 94% rename from GFramework.Core.Abstractions/Cqrs/CqrsHandlerRegistryAttribute.cs rename to GFramework.Cqrs/CqrsHandlerRegistryAttribute.cs index e073fe5c..a64875f3 100644 --- a/GFramework.Core.Abstractions/Cqrs/CqrsHandlerRegistryAttribute.cs +++ b/GFramework.Cqrs/CqrsHandlerRegistryAttribute.cs @@ -1,4 +1,4 @@ -namespace GFramework.Core.Abstractions.Cqrs; +namespace GFramework.Cqrs; /// /// 声明程序集内可供运行时直接调用的 CQRS 处理器注册器类型。 diff --git a/GFramework.Cqrs/CqrsRuntimeFactory.cs b/GFramework.Cqrs/CqrsRuntimeFactory.cs new file mode 100644 index 00000000..45dbb07a --- /dev/null +++ b/GFramework.Cqrs/CqrsRuntimeFactory.cs @@ -0,0 +1,45 @@ +using GFramework.Core.Abstractions.Cqrs; +using GFramework.Core.Abstractions.Ioc; +using GFramework.Core.Abstractions.Logging; +using GFramework.Cqrs.Abstractions.Cqrs; +using GFramework.Cqrs.Internal; + +namespace GFramework.Cqrs; + +/// +/// 提供 CQRS runtime 默认实现的跨程序集创建入口。 +/// +/// +/// 需要在不暴露内部实现细节的前提下接入默认 CQRS runtime, +/// 因此通过该工厂返回抽象接口,而不是直接公开内部 dispatcher / registrar 类型。 +/// +public static class CqrsRuntimeFactory +{ + /// + /// 创建默认 CQRS runtime 分发器。 + /// + /// 目标依赖注入容器。 + /// 用于 runtime 诊断的日志器。 + /// 默认 CQRS runtime。 + public static ICqrsRuntime CreateRuntime(IIocContainer container, ILogger logger) + { + ArgumentNullException.ThrowIfNull(container); + ArgumentNullException.ThrowIfNull(logger); + + return new CqrsDispatcher(container, logger); + } + + /// + /// 创建默认 CQRS 处理器注册器。 + /// + /// 目标依赖注入容器。 + /// 用于注册阶段诊断的日志器。 + /// 默认 CQRS handler registrar。 + public static ICqrsHandlerRegistrar CreateHandlerRegistrar(IIocContainer container, ILogger logger) + { + ArgumentNullException.ThrowIfNull(container); + ArgumentNullException.ThrowIfNull(logger); + + return new DefaultCqrsHandlerRegistrar(container, logger); + } +} diff --git a/GFramework.Core/Extensions/ContextAwareCqrsCommandExtensions.cs b/GFramework.Cqrs/Extensions/ContextAwareCqrsCommandExtensions.cs similarity index 98% rename from GFramework.Core/Extensions/ContextAwareCqrsCommandExtensions.cs rename to GFramework.Cqrs/Extensions/ContextAwareCqrsCommandExtensions.cs index f99fae25..b3c2bde8 100644 --- a/GFramework.Core/Extensions/ContextAwareCqrsCommandExtensions.cs +++ b/GFramework.Cqrs/Extensions/ContextAwareCqrsCommandExtensions.cs @@ -1,7 +1,7 @@ using GFramework.Core.Abstractions.Rule; using GFramework.Cqrs.Abstractions.Cqrs.Command; -namespace GFramework.Core.Extensions; +namespace GFramework.Cqrs.Extensions; /// /// 提供对 接口的 CQRS 命令扩展方法。 diff --git a/GFramework.Core/Extensions/ContextAwareCqrsExtensions.cs b/GFramework.Cqrs/Extensions/ContextAwareCqrsExtensions.cs similarity index 99% rename from GFramework.Core/Extensions/ContextAwareCqrsExtensions.cs rename to GFramework.Cqrs/Extensions/ContextAwareCqrsExtensions.cs index 6db156f5..ef5eb247 100644 --- a/GFramework.Core/Extensions/ContextAwareCqrsExtensions.cs +++ b/GFramework.Cqrs/Extensions/ContextAwareCqrsExtensions.cs @@ -1,7 +1,7 @@ using GFramework.Core.Abstractions.Rule; using GFramework.Cqrs.Abstractions.Cqrs; -namespace GFramework.Core.Extensions; +namespace GFramework.Cqrs.Extensions; /// /// 提供对 接口的 CQRS 统一扩展方法。 diff --git a/GFramework.Core/Extensions/ContextAwareCqrsQueryExtensions.cs b/GFramework.Cqrs/Extensions/ContextAwareCqrsQueryExtensions.cs similarity index 98% rename from GFramework.Core/Extensions/ContextAwareCqrsQueryExtensions.cs rename to GFramework.Cqrs/Extensions/ContextAwareCqrsQueryExtensions.cs index 40ec0f7d..21c1e952 100644 --- a/GFramework.Core/Extensions/ContextAwareCqrsQueryExtensions.cs +++ b/GFramework.Cqrs/Extensions/ContextAwareCqrsQueryExtensions.cs @@ -1,7 +1,7 @@ using GFramework.Core.Abstractions.Rule; using GFramework.Cqrs.Abstractions.Cqrs.Query; -namespace GFramework.Core.Extensions; +namespace GFramework.Cqrs.Extensions; /// /// 提供对 接口的 CQRS 查询扩展方法。 diff --git a/GFramework.Cqrs/GFramework.Cqrs.csproj b/GFramework.Cqrs/GFramework.Cqrs.csproj index 9f002283..86323d6e 100644 --- a/GFramework.Cqrs/GFramework.Cqrs.csproj +++ b/GFramework.Cqrs/GFramework.Cqrs.csproj @@ -11,6 +11,7 @@ + diff --git a/GFramework.Cqrs/GlobalUsings.cs b/GFramework.Cqrs/GlobalUsings.cs new file mode 100644 index 00000000..7f8c14d6 --- /dev/null +++ b/GFramework.Cqrs/GlobalUsings.cs @@ -0,0 +1,6 @@ +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; +global using Microsoft.Extensions.DependencyInjection; diff --git a/GFramework.Core.Abstractions/Cqrs/ICqrsHandlerRegistry.cs b/GFramework.Cqrs/ICqrsHandlerRegistry.cs similarity index 95% rename from GFramework.Core.Abstractions/Cqrs/ICqrsHandlerRegistry.cs rename to GFramework.Cqrs/ICqrsHandlerRegistry.cs index 91af6be7..db3775de 100644 --- a/GFramework.Core.Abstractions/Cqrs/ICqrsHandlerRegistry.cs +++ b/GFramework.Cqrs/ICqrsHandlerRegistry.cs @@ -1,6 +1,6 @@ using GFramework.Core.Abstractions.Logging; -namespace GFramework.Core.Abstractions.Cqrs; +namespace GFramework.Cqrs; /// /// 定义由源码生成器产出的 CQRS 处理器注册器契约。 diff --git a/GFramework.Core/Cqrs/Internal/CqrsDispatcher.cs b/GFramework.Cqrs/Internal/CqrsDispatcher.cs similarity index 99% rename from GFramework.Core/Cqrs/Internal/CqrsDispatcher.cs rename to GFramework.Cqrs/Internal/CqrsDispatcher.cs index 0cae34c4..dafea402 100644 --- a/GFramework.Core/Cqrs/Internal/CqrsDispatcher.cs +++ b/GFramework.Cqrs/Internal/CqrsDispatcher.cs @@ -7,7 +7,7 @@ using GFramework.Core.Abstractions.Logging; using GFramework.Core.Abstractions.Rule; using GFramework.Cqrs.Abstractions.Cqrs; -namespace GFramework.Core.Cqrs.Internal; +namespace GFramework.Cqrs.Internal; /// /// GFramework 自有 CQRS 运行时分发器。 diff --git a/GFramework.Core/Cqrs/Internal/CqrsHandlerRegistrar.cs b/GFramework.Cqrs/Internal/CqrsHandlerRegistrar.cs similarity index 99% rename from GFramework.Core/Cqrs/Internal/CqrsHandlerRegistrar.cs rename to GFramework.Cqrs/Internal/CqrsHandlerRegistrar.cs index 65b1cbcf..85a95509 100644 --- a/GFramework.Core/Cqrs/Internal/CqrsHandlerRegistrar.cs +++ b/GFramework.Cqrs/Internal/CqrsHandlerRegistrar.cs @@ -1,10 +1,9 @@ using System.Reflection; -using GFramework.Core.Abstractions.Cqrs; using GFramework.Core.Abstractions.Ioc; using GFramework.Core.Abstractions.Logging; using GFramework.Cqrs.Abstractions.Cqrs; -namespace GFramework.Core.Cqrs.Internal; +namespace GFramework.Cqrs.Internal; /// /// 在架构初始化期间扫描并注册 CQRS 处理器。 diff --git a/GFramework.Core/Cqrs/Internal/DefaultCqrsHandlerRegistrar.cs b/GFramework.Cqrs/Internal/DefaultCqrsHandlerRegistrar.cs similarity index 96% rename from GFramework.Core/Cqrs/Internal/DefaultCqrsHandlerRegistrar.cs rename to GFramework.Cqrs/Internal/DefaultCqrsHandlerRegistrar.cs index ddf0c06a..70d33562 100644 --- a/GFramework.Core/Cqrs/Internal/DefaultCqrsHandlerRegistrar.cs +++ b/GFramework.Cqrs/Internal/DefaultCqrsHandlerRegistrar.cs @@ -3,7 +3,7 @@ using GFramework.Core.Abstractions.Ioc; using GFramework.Core.Abstractions.Logging; using GFramework.Cqrs.Abstractions.Cqrs; -namespace GFramework.Core.Cqrs.Internal; +namespace GFramework.Cqrs.Internal; /// /// 默认的 CQRS 处理器注册器实现。 diff --git a/GFramework.Core/Cqrs/Notification/NotificationBase.cs b/GFramework.Cqrs/Notification/NotificationBase.cs similarity index 96% rename from GFramework.Core/Cqrs/Notification/NotificationBase.cs rename to GFramework.Cqrs/Notification/NotificationBase.cs index 05db2de7..06390406 100644 --- a/GFramework.Core/Cqrs/Notification/NotificationBase.cs +++ b/GFramework.Cqrs/Notification/NotificationBase.cs @@ -14,7 +14,7 @@ using GFramework.Cqrs.Abstractions.Cqrs; using GFramework.Cqrs.Abstractions.Cqrs.Notification; -namespace GFramework.Core.Cqrs.Notification; +namespace GFramework.Cqrs.Notification; /// /// 表示一个基础通知类,用于处理带有输入的通知模式实现。 diff --git a/GFramework.Core/Cqrs/Query/QueryBase.cs b/GFramework.Cqrs/Query/QueryBase.cs similarity index 97% rename from GFramework.Core/Cqrs/Query/QueryBase.cs rename to GFramework.Cqrs/Query/QueryBase.cs index 759b8df1..d0f491b1 100644 --- a/GFramework.Core/Cqrs/Query/QueryBase.cs +++ b/GFramework.Cqrs/Query/QueryBase.cs @@ -13,7 +13,7 @@ using GFramework.Cqrs.Abstractions.Cqrs.Query; -namespace GFramework.Core.Cqrs.Query; +namespace GFramework.Cqrs.Query; /// /// 表示一个基础查询类,用于处理带有输入和响应的查询模式实现。 diff --git a/GFramework.Core/Cqrs/Request/RequestBase.cs b/GFramework.Cqrs/Request/RequestBase.cs similarity index 97% rename from GFramework.Core/Cqrs/Request/RequestBase.cs rename to GFramework.Cqrs/Request/RequestBase.cs index 5ff18a04..8c534c86 100644 --- a/GFramework.Core/Cqrs/Request/RequestBase.cs +++ b/GFramework.Cqrs/Request/RequestBase.cs @@ -14,7 +14,7 @@ using GFramework.Cqrs.Abstractions.Cqrs; using GFramework.Cqrs.Abstractions.Cqrs.Request; -namespace GFramework.Core.Cqrs.Request; +namespace GFramework.Cqrs.Request; /// /// 表示一个基础请求类,用于处理带有输入和响应的请求模式实现。 diff --git a/GFramework.Godot/Coroutine/ContextAwareCoroutineExtensions.cs b/GFramework.Godot/Coroutine/ContextAwareCoroutineExtensions.cs index 6805d2e7..15ee4561 100644 --- a/GFramework.Godot/Coroutine/ContextAwareCoroutineExtensions.cs +++ b/GFramework.Godot/Coroutine/ContextAwareCoroutineExtensions.cs @@ -1,10 +1,10 @@ using GFramework.Core.Abstractions.Rule; using GFramework.Core.Coroutine; using GFramework.Core.Coroutine.Extensions; -using GFramework.Core.Extensions; using GFramework.Cqrs.Abstractions.Cqrs; using GFramework.Cqrs.Abstractions.Cqrs.Command; using GFramework.Cqrs.Abstractions.Cqrs.Query; +using GFramework.Cqrs.Extensions; namespace GFramework.Godot.Coroutine; diff --git a/GFramework.SourceGenerators.Common/Constants/PathContests.cs b/GFramework.SourceGenerators.Common/Constants/PathContests.cs index 3facd8b6..a9416fbe 100644 --- a/GFramework.SourceGenerators.Common/Constants/PathContests.cs +++ b/GFramework.SourceGenerators.Common/Constants/PathContests.cs @@ -15,6 +15,11 @@ public static class PathContests /// public const string CoreNamespace = $"{BaseNamespace}.Core"; + /// + /// GFramework CQRS runtime 命名空间 + /// + public const string CqrsNamespace = $"{BaseNamespace}.Cqrs"; + /// /// GFramework Godot模块命名空间 /// @@ -45,4 +50,9 @@ public static class PathContests /// GFramework核心抽象层命名空间 /// public const string CoreAbstractionsNamespace = $"{CoreNamespace}.Abstractions"; -} \ No newline at end of file + + /// + /// GFramework CQRS 抽象层命名空间 + /// + public const string CqrsAbstractionsNamespace = $"{CqrsNamespace}.Abstractions"; +} diff --git a/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs b/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs index e2b7ffb1..0392ac8a 100644 --- a/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs +++ b/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs @@ -38,7 +38,7 @@ public class CqrsHandlerRegistryGeneratorTests } } - namespace GFramework.Core.Abstractions.Cqrs + namespace GFramework.Cqrs.Abstractions.Cqrs { public interface IRequest { } public interface INotification { } @@ -47,7 +47,10 @@ public class CqrsHandlerRegistryGeneratorTests public interface IRequestHandler where TRequest : IRequest { } public interface INotificationHandler where TNotification : INotification { } public interface IStreamRequestHandler where TRequest : IStreamRequest { } + } + namespace GFramework.Cqrs + { public interface ICqrsHandlerRegistry { void Register(Microsoft.Extensions.DependencyInjection.IServiceCollection services, GFramework.Core.Abstractions.Logging.ILogger logger); @@ -62,7 +65,7 @@ public class CqrsHandlerRegistryGeneratorTests namespace TestApp { - using GFramework.Core.Abstractions.Cqrs; + using GFramework.Cqrs.Abstractions.Cqrs; public sealed record PingQuery() : IRequest; public sealed record DomainEvent() : INotification; @@ -78,11 +81,11 @@ public class CqrsHandlerRegistryGeneratorTests // #nullable enable - [assembly: global::GFramework.Core.Abstractions.Cqrs.CqrsHandlerRegistryAttribute(typeof(global::GFramework.Generated.Cqrs.__GFrameworkGeneratedCqrsHandlerRegistry))] + [assembly: global::GFramework.Cqrs.CqrsHandlerRegistryAttribute(typeof(global::GFramework.Generated.Cqrs.__GFrameworkGeneratedCqrsHandlerRegistry))] namespace GFramework.Generated.Cqrs; - internal sealed class __GFrameworkGeneratedCqrsHandlerRegistry : global::GFramework.Core.Abstractions.Cqrs.ICqrsHandlerRegistry + internal sealed class __GFrameworkGeneratedCqrsHandlerRegistry : global::GFramework.Cqrs.ICqrsHandlerRegistry { public void Register(global::Microsoft.Extensions.DependencyInjection.IServiceCollection services, global::GFramework.Core.Abstractions.Logging.ILogger logger) { @@ -93,19 +96,19 @@ public class CqrsHandlerRegistryGeneratorTests global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddTransient( services, - typeof(global::GFramework.Core.Abstractions.Cqrs.IRequestHandler), + typeof(global::GFramework.Cqrs.Abstractions.Cqrs.IRequestHandler), typeof(global::TestApp.AlphaQueryHandler)); - logger.Debug("Registered CQRS handler TestApp.AlphaQueryHandler as GFramework.Core.Abstractions.Cqrs.IRequestHandler."); + logger.Debug("Registered CQRS handler TestApp.AlphaQueryHandler as GFramework.Cqrs.Abstractions.Cqrs.IRequestHandler."); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddTransient( services, - typeof(global::GFramework.Core.Abstractions.Cqrs.IStreamRequestHandler), + typeof(global::GFramework.Cqrs.Abstractions.Cqrs.IStreamRequestHandler), typeof(global::TestApp.StreamHandler)); - logger.Debug("Registered CQRS handler TestApp.StreamHandler as GFramework.Core.Abstractions.Cqrs.IStreamRequestHandler."); + logger.Debug("Registered CQRS handler TestApp.StreamHandler as GFramework.Cqrs.Abstractions.Cqrs.IStreamRequestHandler."); global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddTransient( services, - typeof(global::GFramework.Core.Abstractions.Cqrs.INotificationHandler), + typeof(global::GFramework.Cqrs.Abstractions.Cqrs.INotificationHandler), typeof(global::TestApp.ZetaNotificationHandler)); - logger.Debug("Registered CQRS handler TestApp.ZetaNotificationHandler as GFramework.Core.Abstractions.Cqrs.INotificationHandler."); + logger.Debug("Registered CQRS handler TestApp.ZetaNotificationHandler as GFramework.Cqrs.Abstractions.Cqrs.INotificationHandler."); } } @@ -143,7 +146,7 @@ public class CqrsHandlerRegistryGeneratorTests } } - namespace GFramework.Core.Abstractions.Cqrs + namespace GFramework.Cqrs.Abstractions.Cqrs { public interface IRequest { } public interface INotification { } @@ -152,7 +155,10 @@ public class CqrsHandlerRegistryGeneratorTests public interface IRequestHandler where TRequest : IRequest { } public interface INotificationHandler where TNotification : INotification { } public interface IStreamRequestHandler where TRequest : IStreamRequest { } + } + namespace GFramework.Cqrs + { public interface ICqrsHandlerRegistry { void Register(Microsoft.Extensions.DependencyInjection.IServiceCollection services, GFramework.Core.Abstractions.Logging.ILogger logger); @@ -167,7 +173,7 @@ public class CqrsHandlerRegistryGeneratorTests namespace TestApp { - using GFramework.Core.Abstractions.Cqrs; + using GFramework.Cqrs.Abstractions.Cqrs; public sealed record VisibleRequest() : IRequest; diff --git a/GFramework.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs b/GFramework.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs index 39c3aadb..65aad69a 100644 --- a/GFramework.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs +++ b/GFramework.SourceGenerators/Cqrs/CqrsHandlerRegistryGenerator.cs @@ -8,13 +8,17 @@ namespace GFramework.SourceGenerators.Cqrs; [Generator] public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator { - private const string CqrsNamespace = $"{PathContests.CoreAbstractionsNamespace}.Cqrs"; + private const string CqrsContractsNamespace = $"{PathContests.CqrsAbstractionsNamespace}.Cqrs"; + private const string CqrsRuntimeNamespace = PathContests.CqrsNamespace; private const string LoggingNamespace = $"{PathContests.CoreAbstractionsNamespace}.Logging"; - private const string IRequestHandlerMetadataName = $"{CqrsNamespace}.IRequestHandler`2"; - private const string INotificationHandlerMetadataName = $"{CqrsNamespace}.INotificationHandler`1"; - private const string IStreamRequestHandlerMetadataName = $"{CqrsNamespace}.IStreamRequestHandler`2"; - private const string ICqrsHandlerRegistryMetadataName = $"{CqrsNamespace}.ICqrsHandlerRegistry"; - private const string CqrsHandlerRegistryAttributeMetadataName = $"{CqrsNamespace}.CqrsHandlerRegistryAttribute"; + private const string IRequestHandlerMetadataName = $"{CqrsContractsNamespace}.IRequestHandler`2"; + private const string INotificationHandlerMetadataName = $"{CqrsContractsNamespace}.INotificationHandler`1"; + private const string IStreamRequestHandlerMetadataName = $"{CqrsContractsNamespace}.IStreamRequestHandler`2"; + private const string ICqrsHandlerRegistryMetadataName = $"{CqrsRuntimeNamespace}.ICqrsHandlerRegistry"; + + private const string CqrsHandlerRegistryAttributeMetadataName = + $"{CqrsRuntimeNamespace}.CqrsHandlerRegistryAttribute"; + private const string ILoggerMetadataName = $"{LoggingNamespace}.ILogger"; private const string IServiceCollectionMetadataName = "Microsoft.Extensions.DependencyInjection.IServiceCollection"; private const string GeneratedNamespace = "GFramework.Generated.Cqrs"; @@ -273,7 +277,7 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator builder.AppendLine("#nullable enable"); builder.AppendLine(); builder.Append("[assembly: global::"); - builder.Append(CqrsNamespace); + builder.Append(CqrsRuntimeNamespace); builder.Append(".CqrsHandlerRegistryAttribute(typeof(global::"); builder.Append(GeneratedNamespace); builder.Append('.'); @@ -287,7 +291,7 @@ public sealed class CqrsHandlerRegistryGenerator : IIncrementalGenerator builder.Append("internal sealed class "); builder.Append(GeneratedTypeName); builder.Append(" : global::"); - builder.Append(CqrsNamespace); + builder.Append(CqrsRuntimeNamespace); builder.AppendLine(".ICqrsHandlerRegistry"); builder.AppendLine("{"); builder.Append( diff --git a/GFramework.Tests.Common/CqrsTestRuntime.cs b/GFramework.Tests.Common/CqrsTestRuntime.cs index 57d4effd..f5913c6e 100644 --- a/GFramework.Tests.Common/CqrsTestRuntime.cs +++ b/GFramework.Tests.Common/CqrsTestRuntime.cs @@ -4,10 +4,11 @@ using System.Reflection; using GFramework.Core.Abstractions.Cqrs; using GFramework.Core.Abstractions.Ioc; using GFramework.Core.Abstractions.Logging; -using GFramework.Core.Architectures; using GFramework.Core.Ioc; using GFramework.Core.Logging; +using GFramework.Cqrs; using GFramework.Cqrs.Abstractions.Cqrs; +using GFramework.Cqrs.Command; namespace GFramework.Tests.Common; @@ -20,7 +21,9 @@ namespace GFramework.Tests.Common; /// public static class CqrsTestRuntime { - private static readonly Type CqrsHandlerRegistrarType = typeof(ArchitectureContext).Assembly + private static readonly Assembly CqrsRuntimeAssembly = typeof(CommandBase<,>).Assembly; + + private static readonly Type CqrsHandlerRegistrarType = CqrsRuntimeAssembly .GetType( "GFramework.Core.Cqrs.Internal.CqrsHandlerRegistrar", throwOnError: true)!; @@ -40,41 +43,6 @@ public static class CqrsTestRuntime ?? throw new InvalidOperationException( "Failed to locate CqrsHandlerRegistrar.RegisterHandlers."); - private static readonly Type CqrsDispatcherType = typeof(ArchitectureContext).Assembly - .GetType( - "GFramework.Core.Cqrs.Internal.CqrsDispatcher", - throwOnError: true)!; - - private static readonly ConstructorInfo CqrsDispatcherConstructor = CqrsDispatcherType.GetConstructor( - BindingFlags.Instance | - BindingFlags.Public | - BindingFlags.NonPublic, - binder: null, - [ - typeof(IIocContainer), - typeof(ILogger) - ], - modifiers: null) - ?? throw new InvalidOperationException( - "Failed to locate CqrsDispatcher constructor."); - - private static readonly Type DefaultCqrsHandlerRegistrarType = typeof(ArchitectureContext).Assembly - .GetType( - "GFramework.Core.Cqrs.Internal.DefaultCqrsHandlerRegistrar", - throwOnError: true)!; - - private static readonly ConstructorInfo DefaultCqrsHandlerRegistrarConstructor = - DefaultCqrsHandlerRegistrarType.GetConstructor( - BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, - binder: null, - [ - typeof(IIocContainer), - typeof(ILogger) - ], - modifiers: null) - ?? throw new InvalidOperationException( - "Failed to locate DefaultCqrsHandlerRegistrar constructor."); - /// /// 为裸测试容器补齐默认 CQRS runtime seam。 /// @@ -92,16 +60,15 @@ public static class CqrsTestRuntime if (container.Get() is null) { - var runtimeLogger = LoggerFactoryResolver.Provider.CreateLogger(CqrsDispatcherType.Name); - var runtime = (ICqrsRuntime)CqrsDispatcherConstructor.Invoke([container, runtimeLogger]); + var runtimeLogger = LoggerFactoryResolver.Provider.CreateLogger("CqrsDispatcher"); + var runtime = CqrsRuntimeFactory.CreateRuntime(container, runtimeLogger); container.Register(runtime); } if (container.Get() is null) { - var registrarLogger = LoggerFactoryResolver.Provider.CreateLogger(DefaultCqrsHandlerRegistrarType.Name); - var registrar = - (ICqrsHandlerRegistrar)DefaultCqrsHandlerRegistrarConstructor.Invoke([container, registrarLogger]); + var registrarLogger = LoggerFactoryResolver.Provider.CreateLogger("DefaultCqrsHandlerRegistrar"); + var registrar = CqrsRuntimeFactory.CreateHandlerRegistrar(container, registrarLogger); container.Register(registrar); } } diff --git a/GFramework.Tests.Common/GFramework.Tests.Common.csproj b/GFramework.Tests.Common/GFramework.Tests.Common.csproj index 51f8fba9..ddd8c02c 100644 --- a/GFramework.Tests.Common/GFramework.Tests.Common.csproj +++ b/GFramework.Tests.Common/GFramework.Tests.Common.csproj @@ -10,6 +10,7 @@ +