.NET Core依赖解析疑问:为何Woo实例未被创建?
问题原因分析:Woo未被实例化的核心原因
这本质是.NET Core依赖注入(DI)的按需实例化机制导致的,具体可以拆成以下几个关键原因:
1. Goo的构造函数没有声明对IWoo的依赖
.NET Core DI只会解析服务构造函数中显式声明的依赖。如果你的Goo类只是定义了IWoo的成员变量,但没有在构造函数里把IWoo作为参数传入,DI容器完全不知道Woo的存在,自然不会去实例化它。
举个反例(不会触发Woo实例化):
public class Goo : IGoo { // 只是声明了字段,但没通过构造函数注入 private IWoo _woo; public Goo() { Console.WriteLine("Instance of [Goo] being created..."); } }
而正确触发依赖解析的写法是:
public class Goo : IGoo { private IWoo _woo; // 构造函数注入IWoo,DI会自动实例化Woo并传入 public Goo(IWoo woo) { _woo = woo; Console.WriteLine("Instance of [Goo] being created..."); } }
2. Woo的依赖未被DI容器感知
如果Goo里的IWoo是通过手动实例化(比如_woo = new Woo();)或者非DI方式获取的,DI容器不会参与这个实例的创建流程,也就不会触发Woo的初始化日志。
另外,.NET Core DI默认不支持属性注入,如果你的Goo用属性标注了[FromServices]但没在构造函数里声明依赖,DI也不会自动解析IWoo。
3. 单例服务的懒加载特性
你注册的都是单例服务,而单例服务默认是首次被请求时才会实例化。如果没有任何已被实例化的服务(比如Worker、Goo)依赖IWoo,DI容器不会主动创建Woo的实例。
验证方法
你可以通过以下方式验证上述结论:
- 检查
Goo的构造函数是否包含IWoo参数; - 在
Worker的构造函数中添加IWoo依赖,或者修改Goo的构造函数注入IWoo,重新运行后会看到Woo的创建日志; - 在
ConfigureServices末尾手动调用services.BuildServiceProvider().GetRequiredService<IWoo>(),强制触发Woo的实例化,此时日志会打印Woo的创建信息。
内容的提问来源于stack exchange,提问作者Veverke
相关产品推荐
相关产品推荐

