如何使用AutoMapper访问UserViewModel中的角色名称

本文关键字:角色 UserViewModel 何使用 AutoMapper 访问 | 更新日期: 2023-09-27 18:24:03

如何使用AutoMapper访问UserViewModel中的角色名称?

我的用户模型:

 public class User : IdentityUser<long, UserLogin, UserRole, UserClaim>
    {
    }

我的榜样:

 public class Role : IdentityRole<long, UserRole>
    {
    }

我的用户角色模型:

 public class UserRole : IdentityUserRole<long>
    {
    }

我的userViewModel:

 public class UserViewModel
    {
        public List<string> RoleNames { get; set; }
    }

我的映射:

    CreateMap<List<UserRole>, List<string>>().ConvertUsing(new UserRoleConverter());
    CreateMap<User, >()
        .ForMember(d => d.RoleNames, m => m.MapFrom(s =>  s.Roles));

我的用户角色转换器:

 public class UserRoleConverter : ITypeConverter<List<UserRole>, List<string>>
    {
        public List<string> Convert(ResolutionContext context)
        {
            var userRole = context.SourceValue;
        }
    }

如何使用AutoMapper访问UserViewModel中的角色名称

您的示例不完整-您的用户映射引用了示例中不存在的Roles属性。因此,尚不清楚这是Role还是UserRole对象的列表。

然而,只要做一些假设,这是可行的。

首先,TypeConverter应该在UserRolestring之间转换,而不是在列表之间转换:

public class UserRoleConverter : ITypeConverter<UserRole, string>
{
    public string Convert(ResolutionContext context)
    {
         // Assuming a "Name" property on UserRole
         return ((UserRole)context.SourceValue).Name;
    }
} 

所以映射应该是这样的:

Mapper.CreateMap<UserRole, string>().ConvertUsing(new UserRoleConverter());

那么这个测试应该通过:

User user = new User
{
    Roles = new List<UserRole>
    {
      // Assume a constructor to set the Name
      new UserRole("Role1"),
      new UserRole("Role2")
    }
};
UserViewModel uvm = Mapper.Map<User, UserViewModel>(user);
Assert.AreEqual(2, uvm.RoleNames.Count);
Assert.AreEqual("Role1", uvm.RoleNames.First());
Assert.AreEqual("Role2", uvm.RoleNames.Last());