From 95de78efae98b531cc0a8998307b2d1806a70dc4 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Tue, 10 Mar 2026 09:08:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(architecture):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E4=B8=8A=E4=B8=8B=E6=96=87=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=BC=93=E5=AD=98=E5=92=8C=E7=A9=BA=E5=80=BC?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将服务缓存从 Dictionary 替换为 ConcurrentDictionary 以提高线程安全性 - 移除所有 GetService 相关方法的可空返回类型,统一改为非空返回 - 修改 GetOrCache 方法实现,使用 GetOrAdd 方法简化缓存逻辑 - 更新命令和事件总线调用方式,移除空值检查操作符 - 调整接口契约,明确服务不存在时抛出异常而非返回 null - 优化依赖注入容器的服务获取流程,增强错误处理机制 --- .../Architecture/IArchitectureContext.cs | 16 +++---- .../Architectures/ArchitectureContext.cs | 47 +++++++++---------- 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/GFramework.Core.Abstractions/Architecture/IArchitectureContext.cs b/GFramework.Core.Abstractions/Architecture/IArchitectureContext.cs index 341d81a..ae817e5 100644 --- a/GFramework.Core.Abstractions/Architecture/IArchitectureContext.cs +++ b/GFramework.Core.Abstractions/Architecture/IArchitectureContext.cs @@ -19,8 +19,8 @@ public interface IArchitectureContext /// 获取指定类型的服务实例 /// /// 服务类型 - /// 服务实例,如果不存在则返回null - TService? GetService() where TService : class; + /// 服务实例,如果不存在则抛出异常 + TService GetService() where TService : class; /// /// 获取指定类型的所有服务实例 @@ -33,8 +33,8 @@ public interface IArchitectureContext /// 获取指定类型的系统实例 /// /// 系统类型,必须继承自ISystem接口 - /// 系统实例,如果不存在则返回null - TSystem? GetSystem() where TSystem : class, ISystem; + /// 系统实例,如果不存在则抛出异常 + TSystem GetSystem() where TSystem : class, ISystem; /// /// 获取指定类型的所有系统实例 @@ -47,8 +47,8 @@ public interface IArchitectureContext /// 获取指定类型的模型实例 /// /// 模型类型,必须继承自IModel接口 - /// 模型实例,如果不存在则返回null - TModel? GetModel() where TModel : class, IModel; + /// 模型实例,如果不存在则抛出异常 + TModel GetModel() where TModel : class, IModel; /// /// 获取指定类型的所有模型实例 @@ -61,8 +61,8 @@ public interface IArchitectureContext /// 获取指定类型的工具类实例 /// /// 工具类类型,必须继承自IUtility接口 - /// 工具类实例,如果不存在则返回null - TUtility? GetUtility() where TUtility : class, IUtility; + /// 工具类实例,如果不存在则抛出异常 + TUtility GetUtility() where TUtility : class, IUtility; /// /// 获取指定类型的所有工具类实例 diff --git a/GFramework.Core/Architectures/ArchitectureContext.cs b/GFramework.Core/Architectures/ArchitectureContext.cs index 27e2e73..1464b7b 100644 --- a/GFramework.Core/Architectures/ArchitectureContext.cs +++ b/GFramework.Core/Architectures/ArchitectureContext.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using GFramework.Core.Abstractions.Architecture; using GFramework.Core.Abstractions.Command; using GFramework.Core.Abstractions.Environment; @@ -18,31 +19,31 @@ namespace GFramework.Core.Architectures; public class ArchitectureContext(IIocContainer container) : IArchitectureContext { private readonly IIocContainer _container = container ?? throw new ArgumentNullException(nameof(container)); - private readonly Dictionary _serviceCache = new(); + private readonly ConcurrentDictionary _serviceCache = new(); #region Mediator Integration /// /// 获取 Mediator 实例(延迟加载) /// - private IMediator? Mediator => GetOrCache(); + private IMediator Mediator => GetOrCache(); /// /// 获取 ISender 实例(更轻量的发送器) /// - private ISender? Sender => GetOrCache(); + private ISender Sender => GetOrCache(); /// /// 获取 IPublisher 实例(用于发布通知) /// - private IPublisher? Publisher => GetOrCache(); + private IPublisher Publisher => GetOrCache(); /// /// 获取指定类型的服务实例,如果缓存中存在则直接返回,否则从容器中获取并缓存 /// /// 服务类型,必须为引用类型 - /// 服务实例,如果未找到则返回null - public TService? GetService() where TService : class + /// 服务实例,如果不存在则抛出异常 + public TService GetService() where TService : class { return GetOrCache(); } @@ -52,20 +53,14 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext /// 首先尝试从缓存中获取服务实例,如果缓存中不存在则从容器中获取并存入缓存 /// /// 服务类型,必须为引用类型 - /// 服务实例,如果未找到则返回null - private TService? GetOrCache() where TService : class + /// 服务实例,如果不存在则抛出异常 + private TService GetOrCache() where TService : class { - // 尝试从服务缓存中获取已存在的服务实例 - if (_serviceCache.TryGetValue(typeof(TService), out var cached)) - return (TService)cached; - - // 从依赖注入容器中获取服务实例 - var service = _container.Get(); - // 如果服务实例存在,则将其存入缓存以供后续使用 - if (service != null) - _serviceCache[typeof(TService)] = service; - - return service; + return (TService)_serviceCache.GetOrAdd( + typeof(TService), + _ => _container.Get() + ?? throw new InvalidOperationException( + $"Service {typeof(TService)} not registered")); } /// @@ -248,7 +243,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext /// /// 目标系统类型 /// 对应的系统实例 - public TSystem? GetSystem() where TSystem : class, ISystem + public TSystem GetSystem() where TSystem : class, ISystem { return GetService(); } @@ -268,7 +263,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext /// /// 目标模型类型 /// 对应的模型实例 - public TModel? GetModel() where TModel : class, IModel + public TModel GetModel() where TModel : class, IModel { return GetService(); } @@ -288,7 +283,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext /// /// 目标工具类型 /// 对应的工具实例 - public TUtility? GetUtility() where TUtility : class, IUtility + public TUtility GetUtility() where TUtility : class, IUtility { return GetService(); } @@ -416,7 +411,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext { ArgumentNullException.ThrowIfNull(command); var commandBus = GetOrCache(); - commandBus?.Send(command); + commandBus.Send(command); } /// @@ -444,7 +439,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext public void SendEvent() where TEvent : new() { var eventBus = GetOrCache(); - eventBus?.Send(); + eventBus.Send(); } /// @@ -456,7 +451,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext { ArgumentNullException.ThrowIfNull(e); var eventBus = GetOrCache(); - eventBus?.Send(e); + eventBus.Send(e); } /// @@ -482,7 +477,7 @@ public class ArchitectureContext(IIocContainer container) : IArchitectureContext { ArgumentNullException.ThrowIfNull(onEvent); var eventBus = GetOrCache(); - eventBus?.UnRegister(onEvent); + eventBus.UnRegister(onEvent); } ///