2013-03-25 40 views
0

可以說我有這些模型Automapper,通過鏈接關聯映射對象?

public class Mouse 
    { 
     public string Cheese { get; set; } 
    } 

    public class Cat 
    { 
     public string Hairball { get; set; } 
    } 

    public class Dog 
    { 
     public string ChewyToy { get; set; } 
    } 

我一個鼠標映射到貓那麼貓到狗:

Mapper.CreateMap<Mouse, Cat>().ForMember(m => m.Hairball, o => o.MapFrom(src => src.Cheese)); 
    Mapper.CreateMap<Cat, Dog>().ForMember(m => m.ChewyToy, o => o.MapFrom(src => src.Hairball)); 

推而廣之,鼠標也應該被映射到一個狗,對? 當我試圖在兩者之間映射:

var mouse = new Mouse() { Cheese = "Eat me" }; 

    Dog dog = Mapper.Map<Mouse, Dog>(mouse); 

我得到一個異常:

試圖App_Start.MapConfig +鼠標映射到 App_Start.MapConfig +狗。發生類型爲 的異常'AutoMapper.AutoMapperMappingException'。

我該如何做到這一點,沒有明確地創建一個鼠標之間的映射狗?這是一個更大問題的簡單例子。如果他們支持這種行爲,我也願意切換框架,如Value Injector,Glue等。

+0

編寫您自己的Automapper?這種類型的問題比你想象的要困難得多。考慮創建一個圖形數據結構來跟蹤「傳遞」映射。 – 2013-03-25 14:22:16

+1

對不起,但我看到'串奶酪',並認爲「美味!」忽略這個。 – 2013-03-25 14:28:14

+0

你不能,除了Mapper.CreateMap (...) – 2013-03-25 17:19:15

回答

0

我該如何做到這一點,沒有明確地創建一個鼠標到 之間的地圖狗?

答案很簡單:你不能

Automapper具有非常直接的映射對象邏輯。當你添加新的映射:

Mapper.CreateMap<Mouse, Cat>(); 

TypeMap被創建並添加到類型映射列表。是的,有簡單的列表。並且每個TypeMap有兩個屬性:DestinationTypeSourceType。沒有在中間。當您嘗試映射某個對象時,首先簡單地搜索列表TypeMap,它具有完全相同的源和目標類型,如映射中所指定的那樣。它是用下面的方法做(ConfigurationStore類是負責保存配置的映射):

TypeMap FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType) 
{ 
    return this._typeMaps.FirstOrDefault<TypeMap>(x => 
       ((x.DestinationType == destinationType) && 
       (x.SourceType == sourceType))); 
} 

所以,爲您的樣品會出現在列表中有兩個TypeMap對象,當然他們都不匹配DestinationType equalt的條件DogSourceType等於Mouse

+0

你知道它是否可以與其他映射框架,如Value Injector或Glue? – Levitikon 2013-03-25 15:12:35

+0

@Levitikon抱歉,沒有使用它們(你可以在這些映射器上提出另一個問題)。但我不認爲這是可能的。 – 2013-03-25 15:16:46

+0

@Levitikon請考慮以下事項。你有'A-> C','A-> B','C-> D'和'B-> D'的映射。非常合法,是嗎?但是當你將'A'映射到'D'時會發生什麼?我們應該去'A-> B-> D'路徑,還是'A-> C-> D'? 另外映射框架應該是非常快的,因爲大多數情況下它們被用來映射DTO對象來實體(或查看模型)來回。所以,表演很重要。 – 2013-03-25 15:21:37