如何在AutoMapper 6中加密密码?

时间:2017-09-01 01:39:58

标签: c# automapper

  

型号名称:UserModelInsert

     

实体名称:用户

CreateMap<UserModelInsert, User>()
.ForMember(
dest => dest.Password, 
src => src.MapFrom(?????????????????))

我已经以各种方式冒险尝试获得正确的结果。我已经创建了继承接口IValueResolver,IMemberValueResolver以及所有你能想象的类的类,但遗憾的是我无法解决这个问题。

我只需要这样的内容:CreateMap<UserModelInsert, User>().ForMember(dest => dest.Password, src => src.MapFrom(s => StringUtils.Encrypt(s.Password)))但它无效

1 个答案:

答案 0 :(得分:1)

OP:

  

我只需要这样的内容:CreateMap<UserModelInsert, User>().ForMember(dest => dest.Password, src => src.MapFrom(s => StringUtils.Encrypt(s.Password)))但它无效

只需使用AutoMapper的Custom Type Converters功能。

  

有时,您需要完全控制一种类型到另一种类型的转换。这通常是当一种类型看起来与另一种类型不同时,转换功能已经存在,并且您希望从&#34;更宽松的&#34;键入更强类型,例如到目标类型Int32的字符串的源类型。

e.g。 AutoMap的courtesy

Mapper.Initialize(cfg => {
      cfg.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s));
      cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
      cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>();
      cfg.CreateMap<Source, Destination>();
    });

public class DateTimeTypeConverter : ITypeConverter<string, DateTime>
{
    public DateTime Convert(string source, DateTime destination, ResolutionContext context)
    {
        return System.Convert.ToDateTime(source);
    }
}

没有什么可以阻止您创建自己的MyPasswordConverter,将string转换为SecureString

所以以你的例子为例,你可以产生类似的东西:

public class MyPasswordConverter: ITypeConverter<string, SecureString>
{
    public SecureString Convert(string source, SecureString destination, ResolutionContext context)
    {
        return StringUtils.Encrypt(source);
    }
}

...当然假设您的StringUtils.Encrypt返回SecureString(可能应该这样)。

相关问题