在ConvertUsing之后忽略未映射的成员

时间:2016-12-19 18:06:20

标签: c# asp.net-identity automapper automapper-5

这是我的代码:

public class UserProfile:Profile
{
    public UserProfile()
    {
        CreateMap<UserViewModel, ApplicationUsers>().ConvertUsing<UserEncryptor>();
    }

}
public class UserEncryptor : ITypeConverter<UserViewModel, ApplicationUsers>
{
    private readonly IConfigurationRoot _configuration;
    public UserEncryptor(IConfigurationRoot configuration)
    {
        _configuration = configuration;
    }

    public ApplicationUsers Convert(UserViewModel source, ApplicationUsers destination, ResolutionContext context)
    {
        if (context==null||source == null) return null;
        var aes = new Common.EncryptionAes(_configuration[key: "Keys:AesKey"]);
        return new ApplicationUsers
        {
            UserName = aes.EncryptAes(source.Username),
            Email = aes.EncryptAes(source.Email),
            PhoneNumber = aes.EncryptAes(source.MobileNumber),
            User = new User
            {
                FirstName = aes.EncryptAes(source.FirstName),
                LastName = aes.EncryptAes(source.LastName),
                Gender = aes.EncryptAes(source.Gender.ToString()),
                ProfileImage = aes.EncryptAes(source.ProfileImage.FileName)
            }
        };
    }
}

请注意,ApplicationUsers继承自IdentityUser Class。

当我测试这个映射时,我收到了这个错误:

  

System.NullReferenceException:未将对象引用设置为对象的实例。

我知道这个错误是因为某些成员不会被忽略。 像这样的东西

 CreateMap<UserViewModel ,ApplicationUsers >()
.ConvertUsing(converter=> new ApplicationUsers(){
Email = converter.Email,
....
});

会帮助我,因为默认情况下会忽略其他成员,但问题是如果我想使用这种代码,我无法加密我的成员,因为我无法访问配置文件的DI配置。因为配置文件是参数少。

我需要类似于可以在ITypeConverter函数中实现的高级代码。

任何人都有解决方案吗?

1 个答案:

答案 0 :(得分:0)

请参阅此链接GitHub Issue

我问自己,我得到了答案:

在我的测试中,我必须像这样定义配置文件:

 services.AddAutoMapper(typeof(UserProfile));