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);
}
///