2010-05-23 91 views
10

我經常使用AutoMapper將模型(域)對象映射到ViewModel對象,ViewModel對象然後被我的視圖在模型/視圖/視圖模型模式中使用。'CreateMap'語句應該去哪裏?

這涉及許多'Mapper.CreateMap'語句,所有這些語句都必須執行,但只能在應用程序的生命週期中執行一次。從技術上講,我應該把它們全部放在某個地方的靜態方法中,這個方法從我的Application_Start()方法(這是一個ASP.NET MVC應用程序)中調用。

但是,在一箇中心位置將許多不同的映射關係組合在一起似乎是錯誤的。

特別是當映射代碼變得複雜並涉及格式化和其他邏輯時。

是否有更好的方法來組織映射代碼,以便它保持接近它所關注的ViewModel?

(我想出了一個主意 - 有每個視圖模型一個「CreateMappings」的方法,並在BaseViewModel,呼籲實例這種方法。然而,由於該方法只應調用一旦在應用程序生命週期。它需要一些額外的邏輯來緩存已經調用了CreateMappings方法的ViewModel類型列表,然後僅在必要時調用它,以便不在該列表中的ViewModel。)

回答

2

如果使用配置文件,您可以將所有的「CreateMap」調用放在那裏。另外,您可以創建一個包含您的配置的靜態引導程序類,並讓啓動部分調用引導程序。

+0

但仍然沒有解決具有混爲一談所有不同的視圖模型的所有映射的問題,當我寧願有他們以某種方式與他們適用的課程有關。 – Jonathan 2010-05-24 00:36:32

0

OK,現在我做的方式是這樣的:

我添加一些邏輯來我BaseController,它運行「CreateMappings」方法的構造,但只有一次,每控制器類型:

public abstract class BaseController : Controller 
{  
    public BaseController() 
    { 
     if (!controllersWithMappingsCreated.Contains(GetType())) 
     { 
      CreateMappings(); 
      controllersWithMappingsCreated.Enqueue(GetType()); 
     } 
    } 

    protected virtual void CreateMappings() { } 
} 

在每個具體控制器中,我使用CreateMappings來聲明與該控制器相關的所有Models/ViewModel的映射。

public class AccountController : BaseController 
{ 
    public AccountController() : base() { } 

    protected override void CreateMappings() 
    { 
     Mapper.CreateMap<Models.User, ViewModels.UserProfile>(); 
     Mapper.CreateMap<Models.User, ViewModels.ChangePassword>(); 
    } 
} 

我也發現了涉及屬性herehere,但他們打我作爲一個有點過於複雜了一些有趣的選擇。

+2

我仍然有一個靜態引導類,所以你可以單元測試你的映射。 – Martin 2010-07-29 11:15:02

+0

不錯的工作。但是'BaseController'中的'controllersWithMappingsCreated'是什麼? – Blaise 2012-02-13 14:41:15

6

如果你真的不想使用引導程序,那麼至少一個靜態構造函數是確保你的CreateMap最多被調用一次的簡單方法。 (以較少的插科打諢多線程性能要優於喬納森的回答。)

public class AccountController : Controller 
{ 
    static AccountController() 
    { 
     Mapper.CreateMap<Models.User, ViewModels.UserProfile>(); 
     Mapper.CreateMap<Models.User, ViewModels.ChangePassword>(); 
    } 
} 
+0

我沒有將映射放入靜態構造函數中。我發現我必須把它們放在實例構造函數中。 – AaronLS 2012-03-29 17:40:27

+0

@AaronLS哦,不,你會得到一個例外或類似的東西嗎?哪些類用於構造函數和映射? – 2012-04-04 17:19:17