如何将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。

我错过了什么?

-欢呼

如何将automapper用于复杂类型

一种更简单的方法是创建一个类型转换器:

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等的属性,所以你需要检查那里是否也需要手动映射。