如何使用C# Mapster将CreateTaskRequest与额外用户名映射到CreateTaskCommand?
使用Mapster将请求对象与额外字段映射到命令对象
方法1:映射时直接传递额外参数(无需修改全局配置)
这种方式最简单,适合仅在单个地方使用的场景。直接在控制器中调用Mapster的Adapt方法,指定额外字段的值:
修改控制器代码如下:
[HttpPost("Task/Create")] public async Task<IActionResult> CreateTask(CreateTaskRequest request) { var username = User.FindFirstValue(ClaimTypes.GivenName)!; // 使用Mapster完成映射 var command = request.Adapt<CreateTaskCommand>(config => config.Map(dest => dest.Username, _ => username)); var taskResult = await _mediator.Send(command); return Ok("Task Created"); }
或者用更简洁的With语法:
var command = request.Adapt<CreateTaskCommand>() .With(dest => dest.Username, username);
方法2:全局配置映射规则(适合多处复用场景)
如果需要在多个地方复用该映射逻辑,可以在TodolistMappingConfiguration中配置规则,通过Mapster上下文传递额外值:
首先更新映射配置类:
public class TodolistMappingConfiguration : IRegister { public void Register(TypeAdapterConfig config) { config.NewConfig<CreateTaskRequest, CreateTaskCommand>() // 从映射上下文中获取Username参数 .Map(dest => dest.Username, _ => TypeAdapterConfig.GlobalSettings.GetContext().Parameters["Username"]); } }
然后在控制器中调用时传递参数:
[HttpPost("Task/Create")] public async Task<IActionResult> CreateTask(CreateTaskRequest request) { var username = User.FindFirstValue(ClaimTypes.GivenName)!; // 传递Username到映射上下文 var command = request.Adapt<CreateTaskCommand>(new { Username = username }); var taskResult = await _mediator.Send(command); return Ok("Task Created"); }
说明
- Mapster会自动匹配同名属性(比如
Message字段),无需额外配置。 - 两种方法都能实现需求,选择哪种取决于你是否需要复用映射规则。
内容的提问来源于stack exchange,提问作者Martin Rohwedder
相关产品推荐
相关产品推荐

