ASP.NET Core 6.0如何在Program.cs中配置AutoMapper并解决运行报错
问题原因
报错Cannot modify ServiceCollection after application is built的根本原因是:你把AddAutoMapper服务注册代码放在了builder.Build()语句之后。ASP.NET Core 6+的顶层语句Program.cs中,builder.Build()执行后就会完成服务容器的构建,之后不允许再修改服务集合。
正确配置步骤
1. 调整Program.cs代码顺序
所有服务注册逻辑必须放在builder.Build()之前,示例代码如下:
var builder = WebApplication.CreateBuilder(args); // 所有服务注册都要写在这个区域,包括AutoMapper配置 builder.Services.AddControllers(); // AutoMapper配置,你的自定义Profile类写法可以直接沿用 builder.Services.AddAutoMapper(typeof(TechnePaymentApi.Utilities.Automapper)); // 注意:builder.Build()是服务注册的分割线,之后不能再调用builder.Services添加服务 var app = builder.Build(); // 下面都是中间件配置、路由配置等逻辑 app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
2. 确认自定义Profile配置有效
你写的Automapper配置类完全符合要求,继承Profile、在构造函数中声明映射规则的写法是正确的,无需修改。
使用验证
配置完成后,可以在控制器/服务中直接注入IMapper使用映射功能,示例如下:
[ApiController] [Route("[controller]")] public class PaymentController : ControllerBase { private readonly IMapper _mapper; // 构造函数注入 public PaymentController(IMapper mapper) { _mapper = mapper; } [HttpPost] public IActionResult CreatePayment(PaymentRequest request) { // 调用映射 var viewModel = _mapper.Map<PaymentRequestViewModel>(request); // 后续业务逻辑 return Ok(viewModel); } }
内容的提问来源于stack exchange,提问作者hanushic
相关产品推荐
相关产品推荐

