.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
相关产品推荐
相关产品推荐

