using System.Reflection;
using GFramework.Core.Abstractions.Architectures;
using GFramework.Core.Abstractions.Logging;
namespace GFramework.Core.Architectures;
///
/// 架构模块管理器
/// 负责管理架构模块的安装和 CQRS 行为注册
///
internal sealed class ArchitectureModules(
IArchitecture architecture,
IArchitectureServices services,
ILogger logger)
{
///
/// 注册 CQRS 请求管道行为。
/// 支持开放泛型行为类型和针对单一请求的封闭行为类型。
///
/// 行为类型,必须是引用类型
public void RegisterCqrsPipelineBehavior() where TBehavior : class
{
logger.Debug($"Registering CQRS pipeline behavior: {typeof(TBehavior).Name}");
services.Container.RegisterCqrsPipelineBehavior();
}
///
/// 从指定程序集显式注册 CQRS 处理器。
/// 该入口用于把默认架构程序集之外的扩展处理器接入当前架构容器。
///
/// 包含 CQRS 处理器或生成注册器的程序集。
/// 为 。
/// 底层容器已冻结,无法继续注册处理器。
public void RegisterCqrsHandlersFromAssembly(Assembly assembly)
{
ArgumentNullException.ThrowIfNull(assembly);
logger.Debug($"Registering CQRS handlers from assembly: {assembly.FullName ?? assembly.GetName().Name}");
services.Container.RegisterCqrsHandlersFromAssembly(assembly);
}
///
/// 从多个程序集显式注册 CQRS 处理器。
/// 它会复用容器级去重逻辑,避免模块重复接入相同程序集时重复注册 handler。
///
/// 要接入的程序集集合。
/// 为 。
/// 底层容器已冻结,无法继续注册处理器。
public void RegisterCqrsHandlersFromAssemblies(IEnumerable assemblies)
{
ArgumentNullException.ThrowIfNull(assemblies);
logger.Debug("Registering CQRS handlers from additional assemblies.");
services.Container.RegisterCqrsHandlersFromAssemblies(assemblies);
}
///
/// 安装架构模块
///
/// 要安装的模块
/// 安装的模块实例
public IArchitectureModule InstallModule(IArchitectureModule module)
{
var name = module.GetType().Name;
logger.Debug($"Installing module: {name}");
module.Install(architecture);
logger.Info($"Module installed: {name}");
return module;
}
}