// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
using GFramework.Core.Abstractions.Ioc;
using GFramework.Core.Abstractions.Logging;
using GFramework.Cqrs.Abstractions.Cqrs;
using GFramework.Cqrs.Internal;
using GFramework.Cqrs.Notification;
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)
{
return CreateRuntime(container, logger, notificationPublisher: null);
}
///
/// 创建默认 CQRS runtime 分发器,并允许调用方指定通知发布策略。
///
/// 目标依赖注入容器。
/// 用于 runtime 诊断的日志器。
/// 可选的通知发布策略;若为 则使用默认顺序发布器。
/// 默认 CQRS runtime。
///
/// 或 为 。
///
public static ICqrsRuntime CreateRuntime(
IIocContainer container,
ILogger logger,
INotificationPublisher? notificationPublisher)
{
ArgumentNullException.ThrowIfNull(container);
ArgumentNullException.ThrowIfNull(logger);
return new CqrsDispatcher(
container,
logger,
notificationPublisher ?? new SequentialNotificationPublisher());
}
///
/// 创建默认 CQRS 处理器注册器。
///
/// 目标依赖注入容器。
/// 用于注册阶段诊断的日志器。
/// 默认 CQRS handler registrar。
///
/// 或 为 。
///
public static ICqrsHandlerRegistrar CreateHandlerRegistrar(IIocContainer container, ILogger logger)
{
ArgumentNullException.ThrowIfNull(container);
ArgumentNullException.ThrowIfNull(logger);
return new DefaultCqrsHandlerRegistrar(container, logger);
}
///
/// 创建默认的 CQRS 程序集注册协调器。
///
/// 底层 handler 注册器。
/// 用于注册阶段诊断的日志器。
/// 默认 CQRS 程序集注册协调器。
///
/// 或 为 。
///
public static ICqrsRegistrationService CreateRegistrationService(ICqrsHandlerRegistrar registrar, ILogger logger)
{
ArgumentNullException.ThrowIfNull(registrar);
ArgumentNullException.ThrowIfNull(logger);
return new DefaultCqrsRegistrationService(registrar, logger);
}
}