[英]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.