diff --git a/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs b/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs index 760f7cb..01b121d 100644 --- a/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs +++ b/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs @@ -5,6 +5,8 @@ using GFramework.Core.Abstractions.model; using GFramework.Core.Abstractions.query; using GFramework.Core.Abstractions.system; using GFramework.Core.Abstractions.utility; +using Mediator; +using ICommand = GFramework.Core.Abstractions.command.ICommand; namespace GFramework.Core.Abstractions.architecture; @@ -53,7 +55,7 @@ public interface IArchitectureContext /// 命令执行结果类型 /// 要发送的命令 /// 命令执行结果 - TResult SendCommand(ICommand command); + TResult SendCommand(command.ICommand command); /// /// 发送并异步执行一个命令 @@ -75,7 +77,7 @@ public interface IArchitectureContext /// 查询结果类型 /// 要发送的查询 /// 查询结果 - TResult SendQuery(IQuery query); + TResult SendQuery(query.IQuery query); /// /// 异步发送一个查询请求 @@ -113,6 +115,65 @@ public interface IArchitectureContext /// 要取消注册的事件回调方法 void UnRegisterEvent(Action onEvent); + /// + /// 发送请求(统一处理 Command/Query) + /// + ValueTask SendRequestAsync( + IRequest request, + CancellationToken cancellationToken = default); + + /// + /// 发送请求(同步版本,不推荐) + /// + TResponse SendRequest(IRequest request); + + /// + /// 发布通知(一对多事件) + /// + ValueTask PublishAsync( + TNotification notification, + CancellationToken cancellationToken = default) + where TNotification : INotification; + + /// + /// 创建流式请求(用于大数据集) + /// + IAsyncEnumerable CreateStream( + IStreamRequest request, + CancellationToken cancellationToken = default); + + // === 便捷扩展方法 === + + /// + /// 发送命令(无返回值) + /// + ValueTask SendAsync( + TCommand command, + CancellationToken cancellationToken = default) + where TCommand : IRequest; + + /// + /// 发送命令(有返回值) + /// + ValueTask SendAsync( + IRequest command, + CancellationToken cancellationToken = default); + + /// + /// 发送查询 + /// + ValueTask QueryAsync( + IRequest query, + CancellationToken cancellationToken = default); + + /// + /// 发布事件通知 + /// + ValueTask PublishEventAsync( + TNotification notification, + CancellationToken cancellationToken = default) + where TNotification : INotification; + /// /// 获取环境对象 /// diff --git a/GFramework.Core/architecture/ArchitectureContext.cs b/GFramework.Core/architecture/ArchitectureContext.cs index 5d43303..2dda931 100644 --- a/GFramework.Core/architecture/ArchitectureContext.cs +++ b/GFramework.Core/architecture/ArchitectureContext.cs @@ -7,6 +7,8 @@ using GFramework.Core.Abstractions.model; using GFramework.Core.Abstractions.query; using GFramework.Core.Abstractions.system; using GFramework.Core.Abstractions.utility; +using Mediator; +using ICommand = GFramework.Core.Abstractions.command.ICommand; namespace GFramework.Core.architecture; @@ -18,6 +20,18 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext private readonly IIocContainer _container = container ?? throw new ArgumentNullException(nameof(container)); private readonly Dictionary _serviceCache = new(); + #region Mediator Integration (新实现) + + /// + /// 获取 Mediator 实例(延迟加载) + /// + private IMediator? Mediator => GetOrCache(); + + /// + /// 获取 IPublisher 实例(用于发布通知) + /// + private IPublisher? Publisher => GetOrCache(); + /// /// 获取指定类型的服务实例,如果缓存中存在则直接返回,否则从容器中获取并缓存 /// @@ -49,6 +63,132 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext return service; } + /// + /// [Mediator] 发送请求(Command/Query) + /// 这是推荐的新方式,统一处理命令和查询 + /// + /// 响应类型 + /// 请求对象(Command 或 Query) + /// 取消令牌 + /// 响应结果 + /// 当 Mediator 未注册时抛出 + public async ValueTask SendRequestAsync( + IRequest request, + CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(request); + + var mediator = Mediator; + if (mediator == null) + throw new InvalidOperationException( + "Mediator not registered. Call EnableMediator() in your Architecture.Init() method."); + + return await mediator.Send(request, cancellationToken); + } + + /// + /// [Mediator] 发送请求的同步版本(不推荐,仅用于兼容性) + /// + /// 响应类型 + /// 请求对象 + /// 响应结果 + public TResponse SendRequest(IRequest request) + { + return SendRequestAsync(request).AsTask().GetAwaiter().GetResult(); + } + + /// + /// [Mediator] 发布通知(一对多) + /// 用于事件驱动场景,多个处理器可以同时处理同一个通知 + /// + /// 通知类型 + /// 通知对象 + /// 取消令牌 + public async ValueTask PublishAsync( + TNotification notification, + CancellationToken cancellationToken = default) + where TNotification : INotification + { + ArgumentNullException.ThrowIfNull(notification); + + var publisher = Publisher; + if (publisher == null) + throw new InvalidOperationException("Publisher not registered."); + + await publisher.Publish(notification, cancellationToken); + } + + /// + /// [Mediator] 发送请求并返回流(用于大数据集) + /// + /// 响应项类型 + /// 流式请求 + /// 取消令牌 + /// 异步流 + public IAsyncEnumerable CreateStream( + IStreamRequest request, + CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(request); + + var mediator = Mediator; + if (mediator == null) + throw new InvalidOperationException("Mediator not registered."); + + return mediator.CreateStream(request, cancellationToken); + } + + #endregion + + #region Mediator Extension Methods (便捷方法) + + /// + /// [扩展] 发送命令(无返回值) + /// 语法糖,等同于 SendRequestAsync<Unit> + /// + public async ValueTask SendAsync( + TCommand command, + CancellationToken cancellationToken = default) + where TCommand : IRequest + { + await SendRequestAsync(command, cancellationToken); + } + + /// + /// [扩展] 发送命令(有返回值) + /// 语法糖,等同于 SendRequestAsync<TResponse> + /// + public async ValueTask SendAsync( + IRequest command, + CancellationToken cancellationToken = default) + { + return await SendRequestAsync(command, cancellationToken); + } + + /// + /// [扩展] 发送查询 + /// 语法糖,等同于 SendRequestAsync,语义更清晰 + /// + public async ValueTask QueryAsync( + IRequest query, + CancellationToken cancellationToken = default) + { + return await SendRequestAsync(query, cancellationToken); + } + + /// + /// [扩展] 发布事件通知 + /// 语法糖,等同于 PublishAsync + /// + public async ValueTask PublishEventAsync( + TNotification notification, + CancellationToken cancellationToken = default) + where TNotification : INotification + { + await PublishAsync(notification, cancellationToken); + } + + #endregion #region Query Execution @@ -58,7 +198,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext /// 查询结果类型 /// 要发送的查询 /// 查询结果 - public TResult SendQuery(IQuery query) + public TResult SendQuery(Abstractions.query.IQuery query) { if (query == null) throw new ArgumentNullException(nameof(query)); var queryBus = GetOrCache(); @@ -135,7 +275,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext /// 命令执行结果类型 /// 要发送的命令 /// 命令执行结果 - public TResult SendCommand(ICommand command) + public TResult SendCommand(Abstractions.command.ICommand command) { ArgumentNullException.ThrowIfNull(command); var commandBus = GetOrCache();