ASP.NET Core 6 Web API如何正确注册Application层服务集合
IServiceCollection does not contain AddApplication()报错和.NET 6依赖注入机制变更无关:.NET 6只是将原本Startup.cs承载的服务注册、中间件配置逻辑合并到了顶级语句编写的Program.cs中,DI注册的核心逻辑和旧版.NET Core完全一致。找不到扩展方法是以下两个常见原因导致,按顺序排查即可:
- 缺少对应命名空间引用
- 项目引用未正常生效
修复步骤
1. 添加缺失的命名空间引用
你的AddApplication扩展方法定义在Application命名空间下,.NET 6的顶级语句Program.cs不会自动引入未配置全局导入的命名空间,直接调用方法会找不到扩展定义。
在API项目的Program.cs文件最顶部添加命名空间引用即可:
using Application;
如果需要全局生效避免每个文件重复书写using,可以在API项目的GlobalUsings.cs文件中添加全局引用:
global using Application;
2. 校验项目引用有效性
如果添加命名空间后仍然报错,右键点击API项目的「依赖项-项目」节点,确认Application项目的引用是否正常加载。如果引用状态异常(比如显示黄色警告标),删除现有引用后重新添加Application项目的项目引用即可。
洋葱架构下.NET 6服务注册参考示例
修复引用问题后,你原本的注册逻辑可以正常运行,完整的Program.cs服务注册部分参考如下:
// 引入各分层依赖注入扩展的命名空间 using Application; using Infrastructure; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Identity.Web; var builder = WebApplication.CreateBuilder(args); // 身份认证配置 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 分层服务注册,逻辑和旧版Startup.ConfigureServices中完全一致 builder.Services.AddApplication(); // 注册Application层服务:MediatR、AutoMapper、业务服务抽象等 builder.Services.AddInfrastructure(builder.Configuration); // 注册Infrastructure层服务:仓储实现、第三方服务调用、数据库上下文等 builder.Services.AddControllers(); // 中间件管道配置 var app = builder.Build(); // 按业务需求编写中间件逻辑,比如异常处理、路由、鉴权授权等 app.Run();
额外注意:如果你使用的是12.0及以上版本的MediatR,旧版services.AddMediatR(Assembly.GetExecutingAssembly())写法已经过时,建议更新Application层扩展方法中的MediatR注册逻辑,避免编译警告或运行时错误:
// Application项目DependencyInjection类中的MediatR注册更新为 services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()) );
内容的提问来源于stack exchange,提问作者yozawiratama

