2011-09-05 95 views
2

我正在學習AutoMapper並瞭解它用於對象映射。但是現在EFCodeFirst,Dapper和Petpoco都冷卻了這些東西,這將允許我們直接使用POCO和數據庫嗎?我們真的需要Automapper嗎?

那麼有誰能讓我知道爲什麼我們仍然需要automapper嗎?

在此先感謝

最好的問候, Jalpesh

回答

5

我通常使用Automapper映射域模型查看mdoels。如果進行DDD,通常認爲在您的視圖中使用您的域模型並不是一個好主意 - 視圖通常對域有不同的關注點。

例如,你可能有一個用戶模式在您的域:

public class User 
{ 
    public int Id {get;set;} 
    public string EmailAddress {get;set;} 
    public string FirstName {get;set;} 
    public string Surname {get;set;} 
    public string HashedPassword {get;set;} 
    public string EyeColour {get;set;} 
} 

而且你可能有一個用戶彙總頁面,顯示這些項目的一個子集:

public class UserSummary 
{ 
    public string EmailAddress {get;set;} 
    public string Surname {get;set;} 
} 

你可以使用該視圖上的UserSummary類,但您可能會從數據庫中獲取域用戶模型。在這種情況下,你可以使用Automapper到Domain.User映射到ViewModel.UserSummary

var user = _repository.Get(1); 
var viewmodel = Automapper.Map<Domain.User, ViewModel.UserSummary>(user); 
return View(viewmodel); 
+0

它會有什麼性能開銷,因爲我打算它作爲非常大的網站? –

+1

我真的不認爲這會造成問題。我在大型網站上使用沒有問題。實際上設置地圖可能需要一些時間(Mapper.CreateMap調用),並且應該在應用程序啓動時完成一次。以下是關於Automapper性能的分析:http://lostechies.com/jimmybogard/2009/08/05/analyzing-automapper-performance/ – Paul

+1

如果您的View正在進行分頁或過濾,則可能會有性能損失。 Automapper不能與IQueryable對象一起工作,因此您的查詢將在映射時執行。如果您使用Telerik等網格,則在映射後返回viewdata時,它將應用其過濾和排序。你會想看看投影解決這個問題。 – Brian