// Copyright (c) 2025-2026 GeWuYou // SPDX-License-Identifier: Apache-2.0 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; } }