2010-02-01 79 views
2

我從服務器獲取一個複雜對象 - 讓我們將其稱爲ServerDTO。我想將它映射到客戶端對象 - 讓我們稱之爲ClientDTO。C#:用於將一個複雜對象映射到另一個複製對象的庫

假設兩個ServerDTO & ClientDTO內部具有相同的結構。

我想將ServerDTO對象映射到ClientDTO對象。 非常簡單的映射,像這樣:

ServerDTO sd = server.Result; 
ClientDTO cd = new ClientDTO(); 
cd.Property1 = sd.Property1; 
cd.JahRas = sd. JahRas; 

等等...

到目前爲止好。

現在我的問題是這個映射可以在一些抽象層完成,它可以處理所有對象的所有映射,而不管它們是什麼類型或內部的東西?

所以當我要地圖我會去:

ClientDTO cd = Mapper.Map(sourceServerDTO, typeOf(ClientDTO)); 

回答

10

你可能想看看Automapper

+0

討論結束。 – 2010-02-01 13:02:29

+0

太棒了!謝謝! – shemesh 2010-02-01 14:27:44

0

如果2個對象具有相同的結構,並要鏡像爲什麼內容你甚至需要2種不同的類型?你能不能只在你的客戶端代碼中使用ServerDTO類型?

我知道有些時候你需要單獨的類型,但在做這件事之前我會考慮三次。

如果您確實需要不同的類型,那麼我認爲Automapper(Lee在單獨的答案中發佈的鏈接)是一個不錯的選擇。

+0

如果我想使用ServerDTO,我將需要引用它所在的Web服務,我想避免這種情況。 – shemesh 2010-02-01 13:07:58

+0

好的,但是有可能將serverDTO類型聲明移出到單獨的libray中,並在兩個項目中引用該庫?換句話說創建一個通用類型庫?顯然這隻有在你控制客戶端和服務器代碼的情況下才有效。 – 2010-02-01 13:58:06

1

正如史蒂夫所說,我會嘗試只使用一種類型。爲避免直接引用Web服務,請將所有接口/常見類型遷移到您的客戶機和服務器將引用的常見程序集中。顯然,這假定你有兩個代碼庫。

0

客戶端和服務器之間的共享類型僅適用於您不打算讓不同的應用程序調用同一個服務器的情況。 (這種方式擊敗了擁有一組服務器的主要好處之一) 如果你使用共享類型,那麼最終會導致一個域模型的巨大浪費,即一個應用程序中的更改會在另一個應用程序中發生更改。即在一個客戶端上的小改動甚至不涉及服務接口的改變,這可能會導致整個應用程序套件的推出。

我永遠不會說永遠,但共享類型很少是一個好主意。