using System.Reflection;
using GFramework.Core.Abstractions.Lifecycle;
using GFramework.Core.Abstractions.Model;
using GFramework.Core.Abstractions.Systems;
using GFramework.Core.Abstractions.Utility;
namespace GFramework.Core.Abstractions.Architectures;
///
/// 架构接口,专注于生命周期管理,包括系统、模型、工具的注册和获取
/// 业务操作通过 ArchitectureRuntime 提供
///
public interface IArchitecture : IAsyncInitializable, IAsyncDestroyable, IInitializable, IDestroyable
{
///
/// 获取架构上下文
///
IArchitectureContext Context { get; }
///
/// 获取或设置用于配置服务集合的委托
///
///
/// 一个可为空的委托,用于配置IServiceCollection实例
///
Action? Configurator { get; }
///
/// 注册系统实例到架构中
///
/// 系统类型,必须实现ISystem接口
/// 要注册的系统实例
/// 注册的系统实例
T RegisterSystem(T system) where T : ISystem;
///
/// 注册系统实例到架构中
///
/// 系统类型,必须实现ISystem接口
/// 系统实例创建后的回调函数,可为null
void RegisterSystem(Action? onCreated = null) where T : class, ISystem;
///
/// 注册模型实例到架构中
///
/// 模型类型,必须实现IModel接口
/// 要注册的模型实例
/// 注册的模型实例
T RegisterModel(T model) where T : IModel;
///
/// 注册模型实例到架构中
///
/// 模型类型,必须实现IModel接口
/// 模型实例创建后的回调函数,可为null
void RegisterModel(Action? onCreated = null) where T : class, IModel;
///
/// 注册工具实例到架构中
///
/// 工具类型,必须实现IUtility接口
/// 要注册的工具实例
/// 注册的工具实例
T RegisterUtility(T utility) where T : IUtility;
///
/// 注册工具类型并可选地指定创建回调
/// 当工具实例被创建时会调用指定的回调函数
///
/// 工具类型,必须是引用类型且实现IUtility接口
/// 工具实例创建后的回调函数,可为null
void RegisterUtility(Action? onCreated = null) where T : class, IUtility;
///
/// 注册 CQRS 请求管道行为。
/// 既支持实现 IPipelineBehavior<,> 的开放泛型行为类型,
/// 也支持绑定到单一请求/响应对的封闭行为类型。
///
/// 行为类型,必须是引用类型
void RegisterCqrsPipelineBehavior()
where TBehavior : class;
///
/// 从指定程序集显式注册 CQRS 处理器。
/// 当处理器位于默认架构程序集之外的模块或扩展程序集中时,可在初始化阶段调用该入口接入对应程序集。
///
/// 包含 CQRS 处理器或生成注册器的程序集。
/// 为 。
/// 当前架构的底层容器已冻结,无法继续注册处理器。
void RegisterCqrsHandlersFromAssembly(Assembly assembly);
///
/// 从多个程序集显式注册 CQRS 处理器。
/// 该入口会对程序集集合去重,适用于统一接入多个扩展包或模块程序集。
///
/// 要接入的程序集集合。
/// 为 。
/// 当前架构的底层容器已冻结,无法继续注册处理器。
void RegisterCqrsHandlersFromAssemblies(IEnumerable assemblies);
///
/// 安装架构模块
///
/// 要安装的模块
/// 安装的模块实例
IArchitectureModule InstallModule(IArchitectureModule module);
///
/// 注册生命周期钩子
///
/// 生命周期钩子实例
/// 注册的钩子实例
IArchitectureLifecycleHook RegisterLifecycleHook(IArchitectureLifecycleHook hook);
///
/// 等待直到架构准备就绪的异步操作
///
/// 表示异步等待操作的任务
Task WaitUntilReadyAsync();
}