mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-12 22:03:30 +08:00
feat(ioc): 添加Microsoft DI容器适配器及测试
- 实现MicrosoftDiContainer类,包装IServiceProvider为IIocContainer接口 - 提供线程安全的依赖注入容器功能,支持单例、瞬态、作用域服务注册 - 添加RegisterSingleton、RegisterTransient、RegisterScoped等多种注册方法 - 实现RegisterPlurality方法支持一个实例注册到多个接口类型 - 添加CQRS相关注册功能,包括管道行为和处理器自动注册 - 实现Get、GetAll、GetRequired等服务解析方法 - 添加容器冻结机制,冻结后构建ServiceProvider提供服务解析 - 实现CreateScope方法支持服务作用域创建 - 添加完整的单元测试覆盖各种注册和解析场景 - 实现服务按优先级排序功能支持系统调度需求
This commit is contained in:
parent
0d9d09bc4a
commit
a4dfc78201
@ -401,6 +401,17 @@ public class MicrosoftDiContainerTests
|
|||||||
Is.True);
|
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>
|
||||||
/// 测试冻结容器以防止进一步注册的功能
|
/// 测试冻结容器以防止进一步注册的功能
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -399,16 +399,22 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="assemblies">要接入的程序集集合。</param>
|
/// <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="ArgumentNullException"><paramref name="assemblies" /> 中存在 <see langword="null" /> 元素。</exception>
|
||||||
/// <exception cref="InvalidOperationException">容器已冻结,无法继续注册 CQRS 处理器。</exception>
|
/// <exception cref="InvalidOperationException">容器已冻结,无法继续注册 CQRS 处理器。</exception>
|
||||||
public void RegisterCqrsHandlersFromAssemblies(IEnumerable<Assembly> assemblies)
|
public void RegisterCqrsHandlersFromAssemblies(IEnumerable<Assembly> assemblies)
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(assemblies);
|
ArgumentNullException.ThrowIfNull(assemblies);
|
||||||
|
var assemblyArray = assemblies.ToArray();
|
||||||
|
foreach (var assembly in assemblyArray)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(assembly);
|
||||||
|
}
|
||||||
|
|
||||||
_lock.EnterWriteLock();
|
_lock.EnterWriteLock();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ThrowIfFrozen();
|
ThrowIfFrozen();
|
||||||
ResolveCqrsRegistrationService().RegisterHandlers(assemblies);
|
ResolveCqrsRegistrationService().RegisterHandlers(assemblyArray);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user