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.2
和 AutoMapper 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());
我有以下情况:
来源:
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.2
和 AutoMapper 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());