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

.NET 6控制台项目依赖注入调用WebApi服务问题排查

.NET 6控制台项目通过依赖注入调用Web API项目服务的解决方案

问题根源分析

第一个错误原因

你最初的控制台代码创建了两个完全独立的服务容器:

  • WebApplication.CreateBuilder(args)生成的容器确实注册了IMyService,但这个容器完全没被后续的服务解析流程使用
  • 手动new ServiceCollection()创建的容器只注册了ConsoleApp,完全没有IMyService的注册信息,所以解析ConsoleApp时找不到它依赖的IMyService

第二个错误原因

你尝试的方案里只注册了IConsoleApp与ConsoleApp的映射关系,但解析时请求的是具体类型ConsoleApp——容器里没有直接注册ConsoleApp类型,自然找不到对应服务。

正确解决方案

步骤1:确保控制台项目引用Web API项目

右键控制台项目 → 添加 → 项目引用 → 勾选你的Web API项目,保证控制台能访问IMyService和MyService类型。

步骤2:用Generic Host统一管理服务容器

在控制台项目的Program.cs中,使用.NET Generic Host统一注册所有服务,避免创建多个独立容器:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        // 注册Web API中的服务
        services.AddScoped<IMyService, MyService>();
        // 直接注册控制台应用的具体类型
        services.AddScoped<ConsoleApp>();
    })
    .Build();

using var scope = host.Services.CreateScope();
var serviceProvider = scope.ServiceProvider;

// 解析ConsoleApp并运行
var consoleApp = serviceProvider.GetRequiredService<ConsoleApp>();
consoleApp.Run();

如果希望通过接口解析ConsoleApp,可以先定义接口并实现:

// 定义接口
public interface IConsoleApp
{
    void Run();
}

// ConsoleApp实现接口
public class ConsoleApp : IConsoleApp
{
    private readonly IMyService _myService;

    public ConsoleApp(IMyService myService)
    {
        _myService = myService;
    }

    public void Run()
    {
        // 业务逻辑代码
    }
}

注册时改为接口与实现的映射:

services.AddScoped<IConsoleApp, ConsoleApp>();

解析时使用接口类型:

var consoleApp = serviceProvider.GetRequiredService<IConsoleApp>();

额外优化建议

如果Web API和控制台项目都需要使用这些服务,更合理的做法是把IMyService和MyService抽离到独立的类库项目中,让Web API和控制台项目都引用这个类库,避免项目间的直接依赖耦合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:57:46