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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 02:16:59