【aspnetcore】在asp.net core中配置使用AutoMapper


網上使用AutoMapper的文章很多,就不多說了。這里主要記錄一下怎么在項目中配置和使用。

首先是從NuGet獲取AutoMapper。

在Startup.cs文件中注冊AutoMapper服務

public void ConfigureServices(IServiceCollection services)
{
    services.AddAutoMapper();
}

一般把AutoMapper的映射關系單獨寫在一個Profile文件,比如個人習慣在Service層添加一個ServiceProfile.cs文件(這是因為所有的實體和Dto都是在Service層定義的),可能的樣子如下:

public class ServiceProfiles : Profile
{
    public ServiceProfiles()
    {
        CreateMap<WxAccount, WxAccountSessionDto>();
        CreateMap<WxNews, WxNewsListDto>();
        CreateMap<WxMessage, WxMessageListDto>()
            .ForMember(w => w.MatchType, opts =>
            {
                opts.ResolveUsing<WxMessageListDtoResolver>();
            });
    }
}

這個文件也沒什么好說的,必須繼承自AutoMapper.Profile,在構造函數中創建映射關系,具體使用可看看其他大神的文章,這里就不班門弄斧了。

接下來就是最后一步,在項目中使用定義的ServiceProfile,AutoMapper提供了一個Initialize方法,具體用法如下:

Mapper.Initialize(cfg =>
{
    cfg.AddProfile<ServiceProfiles>();
});

這里要注意這句代碼的位置,要寫在Startup.cs的構造函數內

public Startup(IConfiguration configuration)
{
    Configuration = configuration;

    LoggerRepository = LogManager.CreateRepository("NETCoreRepository");
    XmlConfigurator.Configure(LoggerRepository, new FileInfo(Environment.CurrentDirectory + "\\Config\\log4net.config"));

    Mapper.Initialize(cfg =>
    {
        cfg.AddProfile<ServiceProfiles>();
    });
    Mapper.AssertConfigurationIsValid();
}

之前就是因為把初始化代碼寫在ConfigureServices方法內導致配置項不起作用,特此標記。

上面的理解有誤,請參考下面的說明:

一般來講,在ConfigureServices中注冊AutoMapper服務只要如下代碼即可:

services.AddAutoMapper();

AutoMapper會從程序集中搜索Profile的子類,然后把這些子類加入到配置中。如果Profile文件是在當前程序中定義,那沒有問題,但如果是寫在外部類庫內,則是搜索不到的,所以類似我的做法,把Profile定義在類庫內,需要手動把配置文件加入到AutoMapper的配置中,如下:

services.AddAutoMapper(cfg =>
{
    cfg.AddProfile(typeof(ServiceProfiles));
});

但是,如果僅僅這樣,如同我上面的ServiceProfile是不能正確運行的,因為我定義了一個 WxMessageListDtoResolver 這樣一個 IValueResolver 接口的實現,說到這里大家應該猜到,AutoMapper沒法自動調用這個實現,需要我們添加注入,所以還要加入這樣一句

services.AddSingleton<WxMessageListDtoResolver>();

這樣程序就可以正常使用了。

但是,想象一下,如果我們的類庫中如果定義了很多IValueResolver,是不是每個都要注冊一次呢,想想都是噩夢,所以,這里還有一個辦法,就是使用Mapper的Initialize方法,提前把Profile傳遞進去,再調用AddAutoMapper時,會自動將所有的Profile內用到的幾個接口如IValueResolver,IMemberValueResolver的實現注入到程序,這樣就可以了。所以,我之前的理解是錯誤的,並不需要把Initialize寫到Startup的構造函數內,只要在AddAutoMapper之前就可以了。

所以,建議的寫法,在ConfigureServices方法內:

 Mapper.Initialize(cfg =>
{
    cfg.AddProfile<ServiceProfiles>();
});

services.AddAutoMapper();

結束,謝謝~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM