2011-10-07 54 views
0

在這種情況下,我在ASP.MVC 3.0中使用AutoMapper庫來處理dto和模型對象之間的映射。我試圖將所有AutoMapper配置碼在一個地方,因此它具有以下結構:AutoMapper配置在使用ASP.MVC 3.0時重置

protected void Application_Start() 
{ 
    ConfigureAutoMapper(); 
    AreaRegistration.RegisterAllAreas(); 
    SetupWindsorContainer(); 
    RegisterRoutes(RouteTable.Routes); 
} 

... 

private void ConfigureAutoMapper() 
{ 
    Mapper.CreateMap<SampleDto, SampleModel>(); 
    ... 
} 

此代碼被放置在MvcApplication類。通過調試器,我檢查了這個代碼是否被執行,但是當我嘗試在Controller代碼中執行Mapper.Map<>時,我得到了懷疑映射尚未註冊的說法。我曾懷疑這與ASP.MVC如何處理AppDomains有關,但在兩種方法(註冊碼和映射代碼)中似乎都是相同的AppDomain。 ASAIR此代碼上ASP.MVC 2.0

EDIT 1正確執行:上Application_Start 根據MS文檔:

「時調用在ASP.NET 應用所述第一資源(例如,頁)被請求。Application_Start方法中的一個應用程序的生命週期中只能調用 一次。您可以使用此方法 執行啓動任務,如將數據加載到高速緩存 和初始化靜態值。

你應該在應用程序啓動時只設置靜態數據。不要設置 任何實例數據,因爲這將是僅適用於創建的HttpApplication類的第一個 實例。」

AutoMapper配置是靜態類,所以我覺得在Application_Start初始化時,它應能正常工作,但事實並非如此。

回答

3

我建議你安裝WebActivator NuGet包,並用它設置您的AutoMapper。它保證了在啓動時執行,你可以提取您的設置代碼以一個單獨的類,不污染全球。 asax。更重要的是,你可以保持你的AutoMapper代碼在一個單獨的DLL(即,在一個服務層),WebActivator仍然會運行你的代碼而不修改你的MVC項目!

0

Life Cycle Events and the Global.asax file

的的Application_Start和Application_End方法是特殊方法不表示HttpApplication的事件。 ASP.NET在應用程序域的生命週期中調用它們一次,而不是爲每個HttpApplication實例調用它們。

你可以使用Application_BeginRequest來代替,儘管Jakub的回答聽起來像是一個很好的方法!

+0

你不應該把你的AutoMapper配置放在'BeginRequest'中,因爲不需要在每個請求上重新創建配置(出於性能的原因) –

+0

我同意 - 只是指出它爲什麼不起作用,而窮人解決方法。 – Cymen

+0

看看我的'編輯1'筆記。我不同意這個代碼不能從'Application_Start'執行,因爲它足夠爲AppDomain調用一次。 – jethro