Automapper 如果源为空,则设置目标对象属性

Automapper If source is null, set destination object properties

我有以下情况:

来源:

public class AccountLogin
{
    public int UserID { get; set; }

    public bool AccountVerified { get; set; }
}

这个对象是从数据库返回的,所以如果没有找到用户,它可能是空的

目的地:

public class LoginUserResponseModel
{
    public bool AccountExists { get; set; }
    public bool AccountVerified { get; set; }
    public string Status { get; set; }
    public string Token { get; set; }
}

我需要什么?
如果源为空,我需要一个具有以下参数的目标对象的实例:

{
    "AccountExists": false,
    "AccountVerified": false
    "Status": "Error"
    "Token": null
}

我放入MappingProfile.cs文件的AutoMapper代码如下:

 CreateMap<AccountLogin, LoginUserResponseModel>()
     .ForMember(dest => dest.AccountExists, opt => opt.MapFrom(src => src == null ? false : true))
     .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src == null ? "Error" : "Ok"));

当对象不为空时,这段代码工作正常,它设置 Status = "Ok"AccountExists = false

当我从数据库中收到现有用户时,我的来源 AccountLogin,例如:

所以这个映射是这样正确的:

问题是当源为空时,目标也为空:

我有很多解决方法,但我真的很好奇这是否可以用 AutoMapper 实现。
我使用的项目是 ASP Net Core 2.2AutoMapper v6.1.1

为了回应您的评论,我建议使用 CustomTypeConverter:http://docs.automapper.org/en/stable/Custom-type-converters.html

public class AccountLoginConverter : ITypeConverter<AccountLogin, LoginUserResponseModel>
{
    public LoginUserResponseModel Convert(AccountLogin source, LoginUserResponseModel destination, ResolutionContext context)
    {
        if(source == null)
        {
            return new LoginUserResponseModel { AccountExists = false, Status = "Error" }
        }

        // You can have more complex logic here      

        return new LoginUserResponseModel
        {
            AccountExists = true,
            AccountVerified = true, // Or more logic
            Status = "Ok"
        };
    }
}

为了设置您新设计的转换器:

cfg.CreateMap<AccountLogin, LoginUserResponseModel>().ConvertUsing(new AccountLoginConverter());

 cfg.CreateMap<AccountLogin, LoginUserResponseModel>().ConvertUsing<AccountLoginConverter>();

您可以尝试使用自定义 ITypeConverter 的 ConvertUsing:

public class MyConverter : ITypeConverter<AccountLogin, LoginUserResponseModel >
{
    public int Convert(AccountLogin source, LoginUserResponseModel destination, ResolutionContext context)
    {
        return new LoginUserResponseModel{
           AccountExists = source == null ? false : true,
           AccountVerified = false,
           Status = source == null ? "Error" : "Ok",
           "Token": null
        };
    }
}

然后将其映射为:

CreateMap<AccountLogin, LoginUserResponseModel>().ConvertUsing(new MyConverter());