feat(ioc): 添加Microsoft DI容器适配器及测试

- 实现MicrosoftDiContainer类,包装IServiceProvider为IIocContainer接口
- 提供线程安全的依赖注入容器功能,支持单例、瞬态、作用域服务注册
- 添加RegisterSingleton、RegisterTransient、RegisterScoped等多种注册方法
- 实现RegisterPlurality方法支持一个实例注册到多个接口类型
- 添加CQRS相关注册功能,包括管道行为和处理器自动注册
- 实现Get、GetAll、GetRequired等服务解析方法
- 添加容器冻结机制,冻结后构建ServiceProvider提供服务解析
- 实现CreateScope方法支持服务作用域创建
- 添加完整的单元测试覆盖各种注册和解析场景
- 实现服务按优先级排序功能支持系统调度需求
This commit is contained in:
GeWuYou 2026-04-16 09:26:05 +08:00
parent 0d9d09bc4a
commit a4dfc78201
2 changed files with 18 additions and 1 deletions

View File

@ -401,6 +401,17 @@ public class MicrosoftDiContainerTests
Is.True);
}
/// <summary>
/// 测试当程序集集合中包含空元素时CQRS handler 注册入口会在委托给注册服务前直接失败。
/// </summary>
[Test]
public void RegisterCqrsHandlersFromAssemblies_WithNullAssemblyItem_Should_ThrowArgumentNullException()
{
var assemblies = new Assembly[] { typeof(DeterministicOrderNotification).Assembly, null! };
Assert.Throws<ArgumentNullException>(() => _container.RegisterCqrsHandlersFromAssemblies(assemblies));
}
/// <summary>
/// 测试冻结容器以防止进一步注册的功能
/// </summary>

View File

@ -399,16 +399,22 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
/// </summary>
/// <param name="assemblies">要接入的程序集集合。</param>
/// <exception cref="ArgumentNullException"><paramref name="assemblies" /> 为 <see langword="null" />。</exception>
/// <exception cref="ArgumentNullException"><paramref name="assemblies" /> 中存在 <see langword="null" /> 元素。</exception>
/// <exception cref="InvalidOperationException">容器已冻结,无法继续注册 CQRS 处理器。</exception>
public void RegisterCqrsHandlersFromAssemblies(IEnumerable<Assembly> 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
{