簡體   English   中英

如何對復雜類型使用自動映射器

[英]How to use automapper with complex types

在我的視圖的域模型中,我有以下對象用作我的屬性的后備字段

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

是否可以將值從源映射到目標。 使用自動映射器,我具有以下映射設置

//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。

我想念什么?

-干杯

試試這個..您需要提供一個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等的屬性。因此,您需要檢查是否還需要任何手動映射。

一個簡單的方法是創建類型轉換器:

Mapper.CreateMap<string, ModelProperty<string>>()
    .ConvertUsing(src => new ModelProperty<string> { Value = src });

然后,每當AutoMapper看到字符串-> ModelProperty時,您都將擁有此控件。 您完全不必進行特定於成員的配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM