如何使用AutoMapper映射AWS Cognito自定义属性至UserDto
问题描述
我有一个AWS Cognito自定义属性 custom:events_permission,其JSON结构如下:
[ { "id":"48d258b7-8949-41z4-815a-f141487a6de1", "name":"event name", "user_id":"4eef6471-9a79-40r1-qw95-f22974f492d6", "role":"exhibitor-admin", "exhibitor_account_id":"42e812fe-f7ac-48fe-8a15-a0cb80c3ab59", "permissions":[ "exh-manual:['view','edit','add']", "exh-leads:['*']", "exh-usr:['*']" ] } ]
同时我定义了一个C# DTO类 UserDto:
public class UserDto { public string ExhibitorId { get; set; } public string UserId { get; set; } public string Type { get; set; } public string TenantId { get; set; } public string Role { get; set; } public string Permissions { get; set; } }
请问如何使用AutoMapper实现字段映射:将exhibitor_account_id映射到ExhibitorId、permissions映射到Permissions,以及其他对应字段?
解决方案
1. 定义源模型类
首先创建与Cognito属性结构匹配的强类型类,AutoMapper需要基于强类型进行映射:
public class EventPermission { public string Id { get; set; } public string Name { get; set; } [JsonPropertyName("user_id")] public string UserId { get; set; } public string Role { get; set; } [JsonPropertyName("exhibitor_account_id")] public string ExhibitorAccountId { get; set; } public List<string> Permissions { get; set; } }
注意:使用
JsonPropertyName特性匹配JSON中的蛇形命名字段,确保反序列化正确。
2. 配置AutoMapper Profile
创建自定义Profile类,配置字段映射规则,重点处理permissions数组转字符串的逻辑:
public class EventPermissionProfile : Profile { public EventPermissionProfile() { CreateMap<EventPermission, UserDto>() // 映射exhibitor_account_id到ExhibitorId .ForMember(dest => dest.ExhibitorId, opt => opt.MapFrom(src => src.ExhibitorAccountId)) // 将permissions数组序列化为JSON字符串(也可按需用拼接等方式处理) .ForMember(dest => dest.Permissions, opt => opt.MapFrom(src => JsonSerializer.Serialize(src.Permissions))) // 名称匹配的字段直接映射 .ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.UserId)) .ForMember(dest => dest.Role, opt => opt.MapFrom(src => src.Role)) // 无对应源的字段设置为忽略,保持默认值 .ForMember(dest => dest.Type, opt => opt.Ignore()) .ForMember(dest => dest.TenantId, opt => opt.Ignore()); } }
3. 初始化AutoMapper并执行映射
在应用启动时完成AutoMapper初始化,再执行映射操作:
// 初始化Mapper(通常放在Startup或Program.cs中) var configuration = new MapperConfiguration(cfg => { cfg.AddProfile<EventPermissionProfile>(); }); var mapper = configuration.CreateMapper(); // 从Cognito获取属性值并反序列化 string cognitoPermissionJson = "你的Cognito属性JSON字符串"; var eventPermissions = JsonSerializer.Deserialize<List<EventPermission>>(cognitoPermissionJson); // 取数组第一个元素映射为UserDto(根据业务场景处理多元素情况) if (eventPermissions?.Any() == true) { UserDto userDto = mapper.Map<UserDto>(eventPermissions.First()); // 后续使用userDto }
内容的提问来源于stack exchange,提问作者user26912306
相关产品推荐
相关产品推荐

