2016-07-29 40 views
2

我想弄清楚如何在Global.asax級別配置新的AutoMapper。在ASP.NET MVC應用程序的Global.asax級別配置AutoMapper的最新版本

我用來做舊AutoMapper如下:

創建App_Start文件夾中的類調用MappingProfile.cs並在構造我想補充我的映射是這樣的:

public MappingProfile() 
{ 
    Mapper.CreateMap<Product, ProductDto>(); 
    Mapper.CreateMap<ApplicationUser, UserDto>(); 
} 

然後在Global.asax調用:

Mapper.Initialize(cfg => cfg.AddProfile<MappingProfile>()); 

有人可以告訴我如何實現上述與新版本的AutoMapper?我一直在閱讀文檔,但似乎無法得到它。

我相信我做這樣的事情在我MappingProfile.cs文件:

var config = new MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<Product, ProductDto>(); 
     cfg.CreateMap<ApplicationUser, UserDto>(); 
    }); 

,但我做什麼用的配置變量?

+0

你檢查[自述](https://lostechies.com/jimmybogard/2016/01/21/removing-the-static-api-from-automapper /)博客文章? – kayess

+0

是的,我讀了這個和新的AutoMapper文檔,並沒有直接的例子,我應該在Global.Asax中調用以及如何創建MapperProfile類。 –

+0

文檔太簡短。我只是想學習如何使用AutoMapper和3天,仍然不知道如何使用它。一輪又一輪的貶值並沒有幫助。 – xr280xr

回答

3

這就是我的做法。

public abstract class AutoMapperBase 
{ 
    protected readonly IMapper _mapper; 

    protected AutoMapperBase() 
    { 
     var config = new MapperConfiguration(x => 
     { 
      x.CreateMap<Product, ProductDto>(); 
      x.CreateMap<ApplicationUser, UserDto>(); 
     }); 

     _mapper = config.CreateMapper(); 
    } 
} 

然後從需要使用它的任何類繼承AutoMapperBase,並調用它像這樣:

var foo = _mapper.Map<ProductDto>(someProduct); 

你不再需要它宣稱或在Global.asax中

+0

好的,所以我創建了AutoMapperBase類,現在在ApiController中,如果類已經從ApiController繼承,我該如何使用它。只有通過接口才允許多重繼承 –

+0

您可以將此代碼移出類並放入Controller類的構造函數中,或從AutoMapperBase繼承ApiController。在後一種情況下,我會將AutoMapperBase重命名爲AutoMapperApiControllerBase或者更明顯的用於它。 – IntoNET

+0

這樣做有甚麼意義?好像他們希望你爲每個文件中的每個特定場景初始化它。這真的很痛苦,爲什麼它會更好?他們在文檔中推薦什麼? –

0

配置你什麼需要做的是以下幾點:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMissingTypeMaps = true; 
    cfg.AddProfile<MappingProfile>(); 
}); 

這將配置靜態映射器實例娃Š暴露在老AutoMapper,這樣就可以做到:

Mapper.Map<SomeType>(fromObject); 

如果你不想使用靜態實例,那麼你需要看看IntoNET答案。

「CreateMissingTypeMaps」這一行確保缺少的映射是「即時」創建的。這相當於舊的:

Mapper.DynamicMap<SomeType>(fromObject) 

如果您想要手動定義每個映射,您可以刪除此行。

有一個AutoMapper的版本,其中作者試圖擺脫暴露的靜態由於某種原因,但他從我所瞭解的公開喊叫後把它帶回來。所以現在你可以以任何你認爲合適的方式做到這一點。你可以在這裏讀到它:

https://lostechies.com/jimmybogard/2016/02/24/automapper-4-2-1-released-static-is-back-limited-edition/

+0

好吧,我使用的版本是最新最好的版本5.02。因此,不必爲每個特定用例在每個文件中重新配置我的映射。如何在應用程序啓動時完成所有配置,然後在必要時在代碼中調用Mapper.Map? –

+0

@BlakeRivell我的答案就在那裏。定義您的配置文件,然後使用Initialize方法註冊它們。把這段代碼放在global.asax中,你應該可以在代碼的任何地方使用Mapper.Map。基本上調用Initialize方法配置靜態公開的IMapper實例上的映射。 – Marko

+2

我明白你的意思,所以我可以簡單地用一個名爲GenerateMappings的靜態方法創建一個類,我將在我的global.asax文件中調用該方法。在GenerateMappings中,我會調用Mapper.Initialize,然後在我可以調用Mapper.Map的所有文件中調用。這有意義嗎? –

相關問題