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
{