如何将automapper用于复杂类型
本文关键字:复杂 类型 用于 automapper | 更新日期: 2023-09-27 17:57:51
在我的视图的域模型中,我有以下对象作为属性的后备字段
public class ModelProperty<T>// where t:struct
{
public T Value { get; set; }
public string Description { get; set; }
public string LabelName { get; set; }
}
对象依次表示为:
public partial class Incident : BaseEntityModel
{
private ModelProperty<string> typeCode = new ModelProperty<string>{Description="1-C", LabelName = "Type Code"};
private ModelProperty<string> typeText = new ModelProperty<string>{Description="1-C", LabelName = "Type Text"};
public ModelProperty<string> TypeCode { get {return typeCode;}}
public ModelProperty<string> TypeText { get {return typeText;}}
}
业务对象(我的源代码)没有那么复杂。
public partial class Incident : ObjectBase
{
public string TypeCode { get; set; }
public string TypeText { get; set; }
}
是否可以将值从源映射到目标。使用Automapper我有以下映射设置
//note SrcObj is not an object but a namespace alias since the domain and business objects are of the same name
Mapper.CreateMap<SrcObj.Incident, Incident>()
.ForMember(ui => ui.TypeText.Value,
opt => opt.MapFrom(src => src.TypeText));
但我得到的异常表达式必须解析为顶级成员,而不是任何子对象的属性。在子类型上使用自定义冲突解决程序,或者改为使用AfterMap选项。
我是automapper的新手,但在查看文档时,我所处理的对象是否过于复杂(基于这里实际上有三种类型而不是两种)?
如果可以处理这种类型的映射,是如何做到的?
更新
根据吉米的建议,我更新了我的代码如下:
Mapper.CreateMap<SrcObj.Incident, Incident>();
Mapper.CreateMap<string, ModelProperty<string>>()
.ConvertUsing(src => new ModelProperty<string> { Value = src });
Mapper.AssertConfigurationIsValid();
SrcObj.Incident viewModelDto = md.GenerateMockIncident(); //populate the business object with mock data
uibase = Mapper.Map<SrcObj.Incident, Incident>(viewModelDto);
代码执行,我没有得到任何异常,但是在业务对象中设置和返回的值仍然没有分配给支持属性Value
,它仍然为null。
我错过了什么?
-欢呼
一种更简单的方法是创建一个类型转换器:
Mapper.CreateMap<string, ModelProperty<string>>()
.ConvertUsing(src => new ModelProperty<string> { Value = src });
然后,每当AutoMapper看到字符串->ModelProperty时,就会出现这种情况。您根本不需要进行特定于成员的配置。
试试这个。。您需要将ModelProperty对象映射到目标TypeText
Mapper.CreateMap<Funky.Incident, Incident>()
.ForMember(ui => ui.TypeText,
opt => opt.MapFrom(src =>
new ModelProperty<string>
{
Value = src.TypeText
}));
对TypeCode属性映射执行相同操作,以便映射所有字段。
您需要考虑每个成员映射,仅当它们的名称不同或类型名称不同时。在这种情况下,AutoMapper将很难将字符串转换为Model对象,直到您给出提示为止。
也尝试映射TypeCode
。。我不知道ObjectBase等的属性,所以你需要检查那里是否也需要手动映射。