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

ASP.NET Core DI中服务依赖引用不一致问题排查

问题分析与解决方案

成因

你遇到的问题是ASP.NET Core DI容器的正常行为,并非bug或特殊特性:

  • 当你注册services.AddSingleton<IWeatherService, WeatherService>()时,DI容器会创建并管理一个WeatherService的单例实例,用于响应IWeatherService类型的请求。
  • 注册services.AddSingleton<ICurrentWeatherService, CurrentWeatherService>()时,DI容器会单独创建一个CurrentWeatherService实例——这个实例虽然继承自WeatherService,但它的基类成员属于自身实例的一部分,和之前注册的WeatherService单例是完全独立的两个对象。
  • DI容器不会自动识别类之间的继承关系,也不会为子类自动复用基类的已注册实例,它只会严格按照你定义的服务映射规则创建和管理实例。

解决建议

根据你的需求(让WeatherService实例与CurrentWeatherService的基类部分共享同一实例),可以采用以下两种方案:

方案1:统一复用CurrentWeatherService实例

如果CurrentWeatherService是WeatherService的功能扩展,希望所有依赖IWeatherService或ICurrentWeatherService的地方都拿到同一个CurrentWeatherService实例,可以调整注册逻辑:

// 先注册CurrentWeatherService为单例
services.AddSingleton<CurrentWeatherService>();
// 将IWeatherService和ICurrentWeatherService都映射到同一个CurrentWeatherService实例
services.AddSingleton<IWeatherService>(sp => sp.GetRequiredService<CurrentWeatherService>());
services.AddSingleton<ICurrentWeatherService>(sp => sp.GetRequiredService<CurrentWeatherService>());

这样:

  • 当请求IWeatherService时,DI容器会返回CurrentWeatherService的实例
  • CurrentWeatherService中通过base访问的基类方法,就是自身实例的基类实现,和IWeatherService的实例完全一致

方案2:用组合替代继承(推荐)

如果WeatherService和CurrentWeatherService是独立的服务职责,建议放弃继承,改用依赖注入的组合模式,这样天然就能共享实例:

  1. 修改CurrentWeatherService的实现:
public class CurrentWeatherService : ICurrentWeatherService
{
    private readonly IWeatherService _weatherService;

    // 注入已注册的IWeatherService单例
    public CurrentWeatherService(IWeatherService weatherService)
    {
        _weatherService = weatherService;
    }

    public async Task<T> GetWeatherDataAsync<T>(string endpoint) where T : class
    {
        // 直接调用注入的WeatherService实例方法,而非base
        return await _weatherService.GetWeatherDataAsync<T>(endpoint);
    }
}
  1. 保持原有注册逻辑即可:
services.AddSingleton<IWeatherService, WeatherService>();
services.AddSingleton<ICurrentWeatherService, CurrentWeatherService>();

这种方案更符合DI的设计原则,避免了继承带来的实例耦合问题,也更便于后续扩展和维护。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:03:37