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

.NET Core 7中间件中如何通过依赖注入访问ICitySearch?

问题分析与解决方案

你的核心问题是静态成员无法访问类实例的私有字段:ProcessRequestAsync是静态方法,属于类本身而非类的实例;而通过依赖注入注入的_city是类的实例私有字段,两者的生命周期和归属完全不同,这是C#的基础语法限制,和DI本身无关。下面是几种可行的解决方式,按推荐程度排序:


方案一:将静态方法改为实例方法(推荐)

这是最符合.NET Core依赖注入设计理念的方式,让Search类完全由DI容器管理,依赖通过构造函数注入,方法改为实例方法即可正常访问_city字段。

修改后的Search类代码

public class Search
{
    private readonly ICitySearch _city;

    // 构造函数注入依赖
    public Search(ICitySearch city)
    {
        _city = city;
    }

    // 改为实例方法
    public async Task ProcessRequestAsync()
    {
        // 现在可以正常调用_icty的Search方法
        var searchResult = await _city.Search("目标城市名称");
        // 后续处理逻辑
    }
}

调用示例(以Controller为例)

确保Search类已在Program.cs中注册为服务:

builder.Services.AddScoped<Search>();
builder.Services.AddScoped<ICitySearch, CitySearchService>();

在需要调用的地方,通过DI获取Search实例:

public class CityController : ControllerBase
{
    private readonly Search _searchService;

    public CityController(Search searchService)
    {
        _searchService = searchService;
    }

    [HttpGet("search")]
    public async Task<IActionResult> ExecuteSearch()
    {
        await _searchService.ProcessRequestAsync();
        return Ok();
    }
}

方案二:将依赖作为参数传入静态方法

如果必须保留静态方法,可以把ICitySearch实例作为参数传入,由调用方负责提供依赖(调用方需通过DI获取该实例)。

修改后的Search类代码

public class Search
{
    // 静态方法接收ICitySearch参数
    public static async Task ProcessRequestAsync(ICitySearch citySearch)
    {
        var searchResult = await citySearch.Search("目标城市名称");
        // 后续处理逻辑
    }
}

调用示例

public class CityController : ControllerBase
{
    private readonly ICitySearch _citySearch;

    public CityController(ICitySearch citySearch)
    {
        _citySearch = citySearch;
    }

    [HttpGet("search")]
    public async Task<IActionResult> ExecuteSearch()
    {
        await Search.ProcessRequestAsync(_citySearch);
        return Ok();
    }
}

方案三:从DI容器直接解析实例(不推荐)

这种方式可以解决问题,但会破坏DI的控制反转原则,增加代码耦合度,不利于测试和维护,仅作为特殊场景下的备选方案。

步骤1:保存ServiceProvider到静态变量

在Program.cs中:

var builder = WebApplication.CreateBuilder(args);
// 注册服务
builder.Services.AddScoped<ICitySearch, CitySearchService>();
var app = builder.Build();

// 保存ServiceProvider到静态类(仅作示例,生产环境慎用)
AppServiceProvider.Services = app.Services;

// 其他中间件配置...
app.Run();

// 定义静态类存储ServiceProvider
public static class AppServiceProvider
{
    public static IServiceProvider Services { get; set; } = null!;
}

步骤2:在静态方法中解析依赖

public class Search
{
    public static async Task ProcessRequestAsync()
    {
        // 创建作用域(必须,避免服务生命周期问题)
        using var scope = AppServiceProvider.Services.CreateScope();
        var citySearch = scope.ServiceProvider.GetRequiredService<ICitySearch>();
        
        var searchResult = await citySearch.Search("目标城市名称");
        // 后续处理逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:03:17