C# 如何在AutoMapper 6中加密密码?

C# 如何在AutoMapper 6中加密密码?,c#,automapper,C#,Automapper,型号名称:UserModelInsert 实体名称:用户 我已经尝试了各种方法来获得正确的结果。我已经创建了继承接口IValueResolver、IMemberValueResolver和所有您可以想象的东西的类,但不幸的是,我无法解决这个问题 我只需要这样的东西:CreateMap.FormMemberDest=>dest.Password,src=>src.MapFroms=>StringUtils.Encrypts.Password,但它不工作 我只需要这样的东西:CreateMap.Fo

型号名称:UserModelInsert

实体名称:用户

我已经尝试了各种方法来获得正确的结果。我已经创建了继承接口IValueResolver、IMemberValueResolver和所有您可以想象的东西的类,但不幸的是,我无法解决这个问题


我只需要这样的东西:CreateMap.FormMemberDest=>dest.Password,src=>src.MapFroms=>StringUtils.Encrypts.Password,但它不工作


我只需要这样的东西:CreateMap.FormMemberDest=>dest.Password,src=>src.MapFroms=>StringUtils.Encrypts.Password,但它不工作

只需使用AutoMapper的功能

有时,您需要完全控制从一种类型到另一种类型的转换。通常情况下,当一种类型与另一种类型完全不同时,转换函数已经存在,并且您希望从较松散的类型转换为较强的类型,例如从字符串的源类型转换为Int32的目标类型

e、 通用汽车地图

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);
    }
}

…当然假设您的StringUtils.Encrypt返回一个它可能应该返回的SecureString。

为什么AutoMapper要对密码加密负责?AutoMapper将模型映射到DTO/ViewModels,反之亦然,密码的值只是一个加密字符串,应用程序的其他部分必须使用加密的密码值对模型/DTO/ViewModel进行解密,因为我的项目是一个web api,我使用的是泛型类。如果我没有使用automapper,那么在将数据从模型传递到实体时,我会在控制器上这样做。如果我不这样做,我将不得不继承该方法,因为它有一个属性。如果要这样做,我宁愿删除你的Automapper No,因为Automapper做什么都可以。Automapper用于映射模型、DTO和ViewModels,它与您的加密无关,不是为了帮助加密而构建的,也不应该被黑客攻击来处理加密,您的体系结构存在设计问题听起来像,听起来过于复杂,只需要这样的东西:CreateMap.FormMemberDest=>dest.Password,src=>src.MapFroms=>StringUtils.Encrypts.Password但它不再工作了,为什么你认为加密应该与实体/dto/model映射或映射配置交织在一起,它与泛型等问题无关,你现在正在进行黑客攻击,很糟糕的黑客攻击,让一些代码承担太多的责任,你正在创建一个AutoMapper配置,并期望在同一代码行中启动加密,你最终只会像你目前的意图一样,拥有一个巨大的泥球应用程序
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);
    }
}
public class MyPasswordConverter: ITypeConverter<string, SecureString>
{
    public SecureString Convert(string source, SecureString destination, ResolutionContext context)
    {
        return StringUtils.Encrypt(source);
    }
}