.Net Core DI构造函数IEnumerable参数为何默认初始化空集合而非null
问题解答
为什么IEnumerable<T>参数会被初始化为空数组
这是.NET Core 依赖注入容器的内置行为:
- 容器原生支持
IEnumerable<T>类型的解析,逻辑为返回所有已注册的T类型服务实例的集合 - 当没有任何
T类型的服务被注册时,容器不会返回null,而是返回一个长度为0的空数组 - 该设计的目的是避免调用方处理空引用异常,拿到集合后可以直接执行遍历、LINQ操作等逻辑,无需额外判空。同时只要容器能解析到对应类型的合法实例,就会覆盖你在构造函数参数上写的
= null默认值。
符合要求的解决方案(不使用lambda注册SomeoneClass、不修改SomeoneClass代码)
唯一的原生实现方案是直接将IEnumerable<string>类型的全局实现注册为null:
// 加在ConfigureApplicationServices方法内即可 services.AddSingleton<IEnumerable<string>>(null);
注意:该方案是全局生效的,所有依赖
IEnumerable<string>的服务解析时都会拿到null,如果你项目中其他位置需要IEnumerable<string>默认返回空数组的逻辑,不建议使用该方案。
如果你可以接受轻微修改SomeoneClass的代码(仅加特性不修改业务逻辑),.NET 6及以上版本可以使用[DontInject]特性标记参数,告诉DI容器跳过该参数的解析,直接使用默认值:
public SomeoneClass([DontInject] IEnumerable<string> list = null) { _list = list; // 此时会拿到默认值null }
该方案仅影响当前类的参数解析,不会干扰其他服务的注入逻辑,适用范围更广。
内容的提问来源于stack exchange,提问作者Vasiliy
相关产品推荐
相关产品推荐

