2014-04-10 83 views
1

在對我的看法我的域模型我反過來對象被表示爲下面的對象是作爲後備字段爲我的屬性如何使用automapper複雜類型

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它仍然爲空。

我錯過了什麼?

-cheers

+0

我終於發現問題是什麼與未分配的值。我在域模型中創建的屬性只能獲取並返回已定義的但不包含setter的屬性。我爲該屬性添加了一個私有setter,映射現在正在應用 – rlcrews

回答

2

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

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

那麼你也會有這樣的每一個AutoMapper看到串時間 - > ModelProperty。你根本不需要做特定於成員的配置。

+0

我已經更新了我的問題。我嘗試了類型轉換器,並且該方法毫無例外地執行,但是沒有值從業務對象模型中的值分配給域中的模型。有關如何解決此問題的任何建議或確定它未分配的原因? – rlcrews

2

試試這個..你需要給一個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等的屬性所以你需要檢查是否有任何手動映射也需要在那裏。

+0

糾正了初始異常,但我仍未看到映射到新對象的數據。看起來像別處有另一個問題 – rlcrews

+1

這是否通過上述映射? ** AutoMapper.AssertConfigurationIsValid()** –

+0

是的,這是我現在看到的異常它告訴我,其他未映射的成員被發現。我不知道我需要考慮每個成員,我認爲每個定義的映射將適用,如果其他成員被發現,他們將被忽略。我是否假設,如果發現其他映射,它不會映射該對象? – rlcrews