[非專業翻譯] Mapster - 對映配置

玩雙截棍的熊貓發表於2021-06-24

[非專業翻譯] Mapster - 對映配置

系列介紹

[非專業翻譯] 是對沒有中文文件進行翻譯的系列部落格,文章由機翻和譯者自己理解構成,和原文相比有所有不同,但意思基本一致。

因個人能力有限,如有謬誤之處還請指正,多多包涵。

正文

本文將說明 Mapster 中的對映配置

對映配置

使用 TypeAdapterConfig<TSource, TDestination>.NewConfig()TypeAdapterConfig<TSource, TDestination>.ForType() 配置型別對映;

當呼叫 NewConfig 方法時,將會覆蓋已存在的型別對映配置。

TypeAdapterConfig<TSource, TDestination>
    .NewConfig()
    .Ignore(dest => dest.Age)
    .Map(dest => dest.FullName,
        src => string.Format("{0} {1}", src.FirstName, src.LastName));

如若不想覆蓋之前已經建立好的對映配置,可以使用 TypeAdapterConfig<TSource, TDestination>.ForType()

ForType 方法與 NewConfig 的差別:如果指定型別對映配置不存在,那它將建立一個新的對映,如果指定型別的對映配置已存在,那麼它將會擴充套件已有的對映配置,而不是刪除或替換已有的對映配置。

TypeAdapterConfig<TSource, TDestination>
        .ForType()
        .Ignore(dest => dest.Age)
        .Map(dest => dest.FullName,
            src => string.Format("{0} {1}", src.FirstName, src.LastName));

全域性設定

使用全域性設定將對映策略應用到所有的對映配置。

TypeAdapterConfig.GlobalSettings.Default.PreserveReference(true);

對於特定的型別對映,你可以使用 TypeAdapterConfig<SimplePoco, SimpleDto>.NewConfig() 覆蓋全域性對映配置。

TypeAdapterConfig<SimplePoco, SimpleDto>.NewConfig().PreserveReference(false);

基於規則的對映配置

你可以使用 When 方法,當滿足某個條件時,進行一些特定的對映操作。

下面的這個例子,當任何一個對映的 源型別和目標型別 相同時,不對映 Id 屬性:

TypeAdapterConfig.GlobalSettings.When((srcType, destType, mapType) => srcType == destType)
    .Ignore("Id");

在下面這個例子中,對映配置只對 IQueryable 生效:

TypeAdapterConfig.GlobalSettings.When((srcType, destType, mapType) => mapType == MapType.Projection)
    .IgnoreAttribute(typeof(NotMapAttribute));

只配置目標型別

在不確定源型別的時候,使用 ForDestinationType 來建立針對於 目標型別 的對映配置。

比如使用 AfterMapping 在對映完成後呼叫目標型別物件的 Validate 方法:

TypeAdapterConfig.GlobalSettings.ForDestinationType<IValidator>()
                    .AfterMapping(dest => dest.Validate());

注意!在上面的程式碼段中指定目標型別為 IValidator 介面,那麼將會把對映配置應用到所有實現了 IValidator 的型別。

泛型型別對映

如果對映的是泛型型別,可以通過將泛型型別傳給 ForType 來建立設定.

TypeAdapterConfig.GlobalSettings.ForType(typeof(GenericPoco<>), typeof(GenericDto<>))
    .Map("value", "Value");

相關文章