[非專業翻譯] Mapster – 映射配置

  • 2021 年 6 月 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");