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.Command 与 GFramework.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 @@
+