using GFramework.Core.Abstractions.Architectures;
using GFramework.Core.Abstractions.Ioc;
using GFramework.Core.Abstractions.Logging;
using GFramework.Cqrs;
using GFramework.Cqrs.Abstractions.Cqrs;
using GFramework.Cqrs.Notification;
using LegacyICqrsRuntime = GFramework.Core.Abstractions.Cqrs.ICqrsRuntime;
namespace GFramework.Core.Services.Modules;
///
/// CQRS runtime 模块,用于把默认请求分发器与处理器注册器接入架构容器。
/// 该模块在架构初始化早期完成注册,保证用户初始化阶段即可使用 CQRS 入口与 handler 自动接入能力。
///
public sealed class CqrsRuntimeModule : IServiceModule
{
///
/// 获取模块名称。
///
public string ModuleName => nameof(CqrsRuntimeModule);
///
/// 获取模块优先级。
/// CQRS runtime 需要先于架构默认 handler 扫描路径可用,因此放在基础总线模块之后、用户初始化之前注册。
///
public int Priority => 15;
///
/// 获取模块启用状态,默认启用。
///
public bool IsEnabled => true;
///
/// 注册默认 CQRS runtime seam 实现。
/// 该入口会同时补齐旧命名空间下的 ICqrsRuntime 兼容别名,
/// 并保证新旧服务类型都解析到同一个 runtime 实例。
///
/// 目标依赖注入容器。
public void Register(IIocContainer container)
{
ArgumentNullException.ThrowIfNull(container);
var dispatcherLogger = LoggerFactoryResolver.Provider.CreateLogger("CqrsDispatcher");
var registrarLogger = LoggerFactoryResolver.Provider.CreateLogger("DefaultCqrsHandlerRegistrar");
var registrationLogger = LoggerFactoryResolver.Provider.CreateLogger("DefaultCqrsRegistrationService");
var notificationPublisher = container.Get();
var runtime = CqrsRuntimeFactory.CreateRuntime(container, dispatcherLogger, notificationPublisher);
var registrar = CqrsRuntimeFactory.CreateHandlerRegistrar(container, registrarLogger);
container.Register(runtime);
RegisterLegacyRuntimeAlias(container, runtime);
container.Register(registrar);
container.Register(
CqrsRuntimeFactory.CreateRegistrationService(registrar, registrationLogger));
}
///
/// 为旧命名空间下的 CQRS runtime 契约注册兼容别名。
///
/// 承载运行时实例的依赖注入容器。
/// 当前已创建的新 CQRS runtime 实例。
///
/// 旧接口仍作为兼容入口保留,因此这里明确把别名注册收敛到单独 helper,
/// 便于后续独立评估 alias 收口,而不混入 runtime 主体行为。
///
private static void RegisterLegacyRuntimeAlias(IIocContainer container, ICqrsRuntime runtime)
{
container.Register((LegacyICqrsRuntime)runtime);
}
///
/// 初始化模块。
///
public void Initialize()
{
}
///
/// 异步销毁模块。
///
/// 已完成的值任务。
public ValueTask DestroyAsync()
{
return ValueTask.CompletedTask;
}
}