2012-08-10 57 views
1

爲什麼我必須調用.CreateMap方法?爲什麼我必須在AutoMapper中創建地圖

其實它明顯是調用.Map方法具有相同的源/目標參數。

這是一個典型的例子:「如果你不喜歡的軟件,不使用它」

還是有使某行的映射,我不知道一個更簡單的少麻煩的方式?

Mapper.CreateMap<ReleaseViewModel, Release>(); 
Release release = (Release)Mapper.Map(releaseViewModel, typeof(ReleaseViewModel), typeof(Release)); 

回答

1

我想你可以看到「CreateMap <>」的方法註冊一個帶有automapper您的映射。 「Map()」實際上正在執行已註冊的映射。

的「CreateMap <>」具有額外的方法來細粒度的映射,這本身就是一個理由單獨的這兩種方法。認爲它是「分離關注」原則。

一個襯墊包裝

public abstract class Mapper<TFrom, TTo> 
{ 
    private void Configure() 
    { 
     Mapper.CreateMap<TFrom, TTo>(); 
    } 

    public TTo Map(TFrom @from) 
    { 
     Configure(); 
     return Mapper.Map<TFrom, TTo>(@from); 
    } 

    public IEnumerable<TTo> Map(IEnumerable<TFrom> fromList) 
    { 
     return fromList == null 
      ? null 
      : fromList.Select(Map).ToList(); 
    } 
} 
+1

是的,它確實是CreateMap可以做複雜的東西。但是當我想要1:1映射時,作者應該仍然提供一個班輪。我不想圍繞一些屬性複製東西構建架構;-) – Elisabeth 2012-08-10 19:47:53

+0

我認爲你可以輕鬆地用Automapper.Mapper對象的簡單包裝工作。檢查我的編輯。 – KyorCode 2012-08-13 12:21:36

0

它以映射註冊到AutoMapper的方式。此方法的一個優點是您可以撥打

Mapper.AssertConfigurationIsValid(); 

檢查映射是否有效。

爲了方便,你可以創建你的地方所有的映射一個地方(如ASP.NET MVC,你可以將它放在ApplicationStart在Global.asax)

順便說一句,你的地圖 - 方法,你也可以使用以下命令:

Release release = Mapper.Map<ReleaseViewModel,Release>(releaseViewModel); 
+0

是的,我看到另一種方法,但知道我明白它的意義大聲笑;-)我試着valueinjecter和它的完美,除非它不返回一個業務對象(發佈)它必須總是手動實例化:/我正在尋找一個單線工具... – Elisabeth 2012-08-10 10:36:52

0

疑難雜症... EmitMapper:一個襯墊,但醜陋改爲地獄;-)

Release release = ObjectMapperManager.DefaultInstance.GetMapper<ReleaseViewModel,Release>().Map(releaseViewModel); 

http://emitmapper.codeplex.com/

0

這就是爲什麼我更喜歡價值噴油器進行簡單的1 < - > 1點的映射。閱讀在這裏:http://valueinjecter.codeplex.com/

這是非常簡單:

myObject.InjectFrom(anyOtherObject); 

而且會隱地圖相同的名稱和類型的屬性。

+0

閱讀我的評論給用戶「Pbirkoff」,那麼你知道爲什麼valueinjecter不是一個單行:) – Elisabeth 2012-08-10 13:41:02

4

我被同樣的事情困惑了一會兒,如果我只想用零配置映射對象a-b呢?那麼它原來有一種方法:

Mapper.DynamicMap<MyType>(mySourceObject); 

地圖的目的是在源和目標之間的合同總是明確定義的情況下使用。因此,這一合同的遺漏就是違反了這一使用原則。