You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6内置DI是否有Simple Injector RegisterConditional的等效实现?

.NET 6 内置DI 等效实现方案

原Simple Injector代码完成了两个核心逻辑:注册具体的IValidator<T>实现,以及为未匹配到具体实现的IValidator<T>提供单例的默认装饰器ValidateNothingDecorator<T>。以下是.NET 6内置IServiceCollection的等效实现:

1. 注册具体验证器

直接使用内置DI的泛型注册方法,对应原代码的基础注册逻辑:

// 按原Simple Injector默认生命周期(Transient)注册具体验证器
services.AddTransient<IValidator<Foo>, FooValidator>();
services.AddTransient<IValidator<Bar>, BarValidator>();

// 若需调整生命周期,可替换为AddScoped或AddSingleton
// services.AddSingleton<IValidator<Foo>, FooValidator>();

2. 实现条件默认装饰器

.NET内置DI的开放泛型注册优先级低于具体泛型注册,刚好可以对应原代码中!c.Handled的条件逻辑:先注册所有具体实现,再注册开放泛型的默认实现。当解析IValidator<T>时,系统会优先使用已注册的具体实现;若没有匹配的具体实现,则自动使用默认装饰器。

代码实现:

// 注册开放泛型的单例默认装饰器,仅当无对应具体IValidator<T>时生效
services.AddSingleton(typeof(IValidator<>), typeof(ValidateNothingDecorator<>));

复杂条件场景扩展

如果需要更灵活的条件判断(而非仅检查是否存在具体实现),可以通过工厂委托实现:

services.AddSingleton(typeof(IValidator<>), provider =>
{
    var serviceType = typeof(IValidator<>);
    var genericArgs = serviceType.GetGenericArguments();
    var specificValidatorType = serviceType.MakeGenericType(genericArgs);
    
    // 尝试获取已注册的具体实现
    var existingValidator = provider.GetService(specificValidatorType);
    if (existingValidator != null)
    {
        return existingValidator;
    }
    
    // 这里可添加自定义条件判断逻辑
    // 示例:仅当T是某个基类时才使用默认装饰器
    // if (typeof(BaseEntity).IsAssignableFrom(genericArgs[0]))
    // {
    //     return ActivatorUtilities.CreateInstance(provider, typeof(ValidateNothingDecorator<>).MakeGenericType(genericArgs));
    // }
    
    // 返回默认装饰器
    return ActivatorUtilities.CreateInstance(provider, typeof(ValidateNothingDecorator<>).MakeGenericType(genericArgs));
});

内容的提问来源于stack exchange,提问作者Stephen York

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:10:34