using GFramework.Core.Abstractions.architecture;
using GFramework.Core.Abstractions.command;
using GFramework.Core.Abstractions.events;
using GFramework.Core.Abstractions.query;
namespace GFramework.Core.architecture;
///
/// 架构运行时默认实现,委托 ArchitectureContext 执行具体操作
///
public class ArchitectureRuntime(IArchitectureContext context) : IArchitectureRuntime
{
private readonly IArchitectureContext _context = context ?? throw new ArgumentNullException(nameof(context));
#region Query Execution
///
/// 发起一次查询请求并获得其结果
///
/// 查询结果的数据类型
/// 要发起的查询对象
/// 查询得到的结果数据
public TResult SendQuery(IQuery query)
{
return _context.SendQuery(query);
}
#endregion
#region Command Execution
///
/// 发送一个无返回结果的命令请求
///
/// 命令的具体类型
/// 要发送的命令对象
public void SendCommand(TCommand command) where TCommand : ICommand
{
_context.SendCommand(command);
}
///
/// 发送一个带返回结果的命令请求
///
/// 命令执行后的返回值类型
/// 要发送的命令对象
/// 命令执行的结果
public TResult SendCommand(ICommand command)
{
return _context.SendCommand(command);
}
#endregion
#region Event Management
///
/// 发布一个默认构造的新事件对象
///
/// 事件类型
public void SendEvent() where TEvent : new()
{
_context.SendEvent();
}
///
/// 发布一个具体的事件对象
///
/// 事件类型
/// 要发布的事件实例
public void SendEvent(TEvent e) where TEvent : class
{
_context.SendEvent(e);
}
///
/// 订阅某个特定类型的事件
///
/// 事件类型
/// 当事件发生时触发的动作
/// 可用于取消订阅的对象
public IUnRegister RegisterEvent(Action onEvent)
{
return _context.RegisterEvent(onEvent);
}
///
/// 取消对某类型事件的监听
///
/// 事件类型
/// 之前绑定的事件处理器
public void UnRegisterEvent(Action onEvent)
{
_context.UnRegisterEvent(onEvent);
}
#endregion
}