2010-10-22 341 views
5

我的問題可能很愚蠢,但我很確定我錯過了這個問題的一個非常重要的部分。我必須做一些對象到對象的映射(在C#項目中使用的域類和發送到Flash客戶端的類之間)。使用automapper的優點是什麼?

我的第一個選擇是Automapper。但我有一些問題(嵌套屬性,而不是paramterless構造函數定義)。事實證明,使用automapper映射一個非常複雜的類型並不那麼容易。

然後我的問題是:爲什麼不實行類似的方法:

ClassA GetClassAByClassB(ClassB pObj) 

    { 
    ClassA objA = new ClassA(); 
    objA.Prop1 = pObj.Prop1; 
    objA.NestedType.Prop2 = pObj.Prop2; 
    //....Some more..... 
    return objA; 
    } 

它究竟像使用Automapper進行映射的靈活性同一水平。您仍然必須提供源對象中的哪些屬性被複制到目標對象中的哪些屬性中。你只需要使用'='而不是lambda表達式。

但是,如果你改變了你的域類中的某些東西,你必須改變這個「映射」部分。那麼,說服我使用Automapper的主要原因是什麼(正如我在開始時所說的,我很確定我錯過了一些重要的東西)。

回答

3

因爲與AutoMapper你要實現這些方法;-)

你的方法需要編寫的

classA.propA = classB.propA; 
classA.propB = classB.propB; 
classA.propC = classB.propC; 
classA.propD = classB.propD; 
classA.propE = classB.propE; 

很多AutoMapper使用慣例推測它本身。更重要的是,您不必擔心pObj == null(在這種情況下,您的代碼將拋出NulLReferenceException)。

您還可以在地圖中定義轉換(即將字符串轉換爲DateTime)。

Mapper.CreateMap<User, UserModel>().ForMember(d => d.LastLogin, c => c.MapFrom<DateTime?>(u => u.Credential.LastLogin)); 

AutoMapper也支持嵌套屬性。

在這裏閱讀更多:AutoMapper Introduction and Samples

+0

那些沒有相同名稱的房產呢?和嵌套的屬性?我認爲我應該改變慣例,但有時一方的財產是'PositionX',而另一方只是'X'。 (只是一個例子 - 屬性anmes可能是相當不可預知的)。所以不是我不應該在我的情況下使用Automapper? – Katalonis 2010-10-22 11:23:45

+0

@Katalonis - 然後使用lambda表達式以類型安全的方式配置映射器。添加了代碼示例和鏈接。 – 2010-10-22 11:58:06

1

說AutoMapper聲稱有一個好處是通過約定的映射。下面是從"AutoMapper Introduction and Samples"

報價「就在於此AutoMapper。美景當你的等級排列 自己的傳統,你的映射配置可以像 簡單的」

這樣做的好處是有代價。重命名或更改目標和源屬性將會破壞映射並引入運行時錯誤,而不是編譯錯誤。

如果你不能依賴約定映射,AutoMapper將失去它的優勢。在這種情況下,我寧願寫下如下的工廠函數。

public static ClassA MapToClassA(this ClassB b) 
{ 
    return new ClassA() 
    { 
     propA = b.propA; 
     propB = b.propB; 
     propC = b.propC; 
    } 
} 

那麼你將構建目標對象像

var classA = classB.MapToClassA(); 

,而不是

var classA = Mapper.Map<ClassB, ClassA>(classB) 

就個人而言,我更喜歡工廠功能,即使約定映射其明確性,可讀性是可能的和調試友好性。在第二種情況下,試圖找出ClassB如何映射到ClassA,映射配置文件是否已加載,或爲什麼在調用映射<>()函數時出現異常,或者爲什麼某些屬性已被分配了錯誤的值。