From a4dfc78201650a5fa847f51033913cbd76ddab18 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Thu, 16 Apr 2026 09:26:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(ioc):=20=E6=B7=BB=E5=8A=A0Microsoft=20DI?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E9=80=82=E9=85=8D=E5=99=A8=E5=8F=8A=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现MicrosoftDiContainer类,包装IServiceProvider为IIocContainer接口 - 提供线程安全的依赖注入容器功能,支持单例、瞬态、作用域服务注册 - 添加RegisterSingleton、RegisterTransient、RegisterScoped等多种注册方法 - 实现RegisterPlurality方法支持一个实例注册到多个接口类型 - 添加CQRS相关注册功能,包括管道行为和处理器自动注册 - 实现Get、GetAll、GetRequired等服务解析方法 - 添加容器冻结机制,冻结后构建ServiceProvider提供服务解析 - 实现CreateScope方法支持服务作用域创建 - 添加完整的单元测试覆盖各种注册和解析场景 - 实现服务按优先级排序功能支持系统调度需求 --- .../Ioc/MicrosoftDiContainerTests.cs | 11 +++++++++++ GFramework.Core/Ioc/MicrosoftDiContainer.cs | 8 +++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/GFramework.Core.Tests/Ioc/MicrosoftDiContainerTests.cs b/GFramework.Core.Tests/Ioc/MicrosoftDiContainerTests.cs index 4e3b5b23..19c59dcb 100644 --- a/GFramework.Core.Tests/Ioc/MicrosoftDiContainerTests.cs +++ b/GFramework.Core.Tests/Ioc/MicrosoftDiContainerTests.cs @@ -401,6 +401,17 @@ public class MicrosoftDiContainerTests Is.True); } + /// + /// 测试当程序集集合中包含空元素时,CQRS handler 注册入口会在委托给注册服务前直接失败。 + /// + [Test] + public void RegisterCqrsHandlersFromAssemblies_WithNullAssemblyItem_Should_ThrowArgumentNullException() + { + var assemblies = new Assembly[] { typeof(DeterministicOrderNotification).Assembly, null! }; + + Assert.Throws(() => _container.RegisterCqrsHandlersFromAssemblies(assemblies)); + } + /// /// 测试冻结容器以防止进一步注册的功能 /// diff --git a/GFramework.Core/Ioc/MicrosoftDiContainer.cs b/GFramework.Core/Ioc/MicrosoftDiContainer.cs index 5c49621a..6152366f 100644 --- a/GFramework.Core/Ioc/MicrosoftDiContainer.cs +++ b/GFramework.Core/Ioc/MicrosoftDiContainer.cs @@ -399,16 +399,22 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null) /// /// 要接入的程序集集合。 /// + /// 中存在 元素。 /// 容器已冻结,无法继续注册 CQRS 处理器。 public void RegisterCqrsHandlersFromAssemblies(IEnumerable assemblies) { ArgumentNullException.ThrowIfNull(assemblies); + var assemblyArray = assemblies.ToArray(); + foreach (var assembly in assemblyArray) + { + ArgumentNullException.ThrowIfNull(assembly); + } _lock.EnterWriteLock(); try { ThrowIfFrozen(); - ResolveCqrsRegistrationService().RegisterHandlers(assemblies); + ResolveCqrsRegistrationService().RegisterHandlers(assemblyArray); } finally {