using GFramework.Core.command;
using GFramework.Core.events;
using GFramework.Core.model;
using GFramework.Core.query;
using GFramework.Core.system;
using GFramework.Core.utility;
namespace GFramework.Core.architecture;
///
/// 架构接口,定义了应用程序架构的核心功能,包括系统、模型、工具的注册和获取,
/// 以及命令、查询、事件的发送和处理机制
///
public interface IArchitecture
{
///
/// 注册系统实例到架构中
///
/// 系统类型,必须实现ISystem接口
/// 要注册的系统实例
void RegisterSystem(T system) where T : ISystem;
///
/// 注册模型实例到架构中
///
/// 模型类型,必须实现IModel接口
/// 要注册的模型实例
void RegisterModel(T model) where T : IModel;
///
/// 注册工具实例到架构中
///
/// 工具类型,必须实现IUtility接口
/// 要注册的工具实例
void RegisterUtility(T utility) where T : IUtility;
///
/// 从架构中获取指定类型的系统实例
///
/// 系统类型,必须是class且实现ISystem接口
/// 指定类型的系统实例
T? GetSystem() where T : class, ISystem;
///
/// 从架构中获取指定类型的模型实例
///
/// 模型类型,必须是class且实现IModel接口
/// 指定类型的模型实例
T? GetModel() where T : class, IModel;
///
/// 从架构中获取指定类型的工具实例
///
/// 工具类型,必须是class且实现IUtility接口
/// 指定类型的工具实例
T? GetUtility() where T : class, IUtility;
///
/// 发送并执行指定的命令
///
/// 命令类型,必须实现ICommand接口
/// 要执行的命令实例
void SendCommand(T command) where T : ICommand;
///
/// 发送并执行带有返回值的命令
///
/// 命令执行结果的类型
/// 要执行的命令实例
/// 命令执行的结果
TResult SendCommand(ICommand command);
///
/// 发送并执行查询操作
///
/// 查询结果的类型
/// 要执行的查询实例
/// 查询的结果
TResult SendQuery(IQuery query);
///
/// 发送无参事件
///
/// 事件类型,必须具有无参构造函数
void SendEvent() where T : new();
///
/// 发送指定的事件实例
///
/// 事件类型
/// 要发送的事件实例
void SendEvent(T e);
///
/// 注册事件监听器
///
/// 事件类型
/// 事件触发时的回调方法
/// 用于取消注册的句柄
IUnRegister RegisterEvent(Action onEvent);
///
/// 取消注册事件监听器
///
/// 事件类型
/// 要取消注册的事件回调方法
void UnRegisterEvent(Action onEvent);
}