.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
相关产品推荐
相关产品推荐

