ASP.NET Core擴展庫之實體映射


在分層設計模式中,各層之間的數據通常通過數據傳輸對象(DTO)來進行數據的傳遞,而大多數情況下,各層數據的定義結構大同小異,如何在這些定義結構中相互轉換,之前我們通過使用AutoMapper庫,但AutoMapper功能龐大,使用較為復雜,而在很多場景下,可能我們只需要一些基礎的對象映射功能,那么此時你可以選擇擴展庫中的輕量級AutoMapper實現。

實體映射包含以下核心功能:

  • 在使用之前無需手動定義類型之間的映射關系
  • 采用動態編譯、緩存轉換委托,提升性能。
  • 支持通過特性定義屬性映射關系
  • 支持插入自定義的轉換處理方法
  • 支持列表轉換
  • 支持嵌套類型轉換
  • 支持循環引用及引用關系維持
  • 支持轉換模式或拷貝模式
  • 支持生成預定義的拷貝委托
  • 為了保持其輕量性,目前支持以下轉換
    • 值類型轉換
    • 數值類型之間的兼容轉換(如int-->uint)
    • 支持值類型與其可空類型間的兼容轉換
    • 字典類型轉換
    • 列表類型轉換
    • 枚舉類型與string類型間的轉換
    • 不支持結構體之間的轉換以及結構體與類之間的轉換

一、啟用

啟用輕量級的實體映射,有兩種方式:

  • 如果你是和擴展庫其他功能同時使用,可直接通過UseExtensions即可
    using IHost host = Host.CreateDefaultBuilder()
                         // UseExtensions會自動注入Mapper
                         .UseExtensions()
                         .ConfigureServices(sc =>
                         {
                             // 通過ConfigureLightweightMapper來配置映射
                             sc.ConfigureLightweightMapper(options =>
                             {
                                //
                             });
                         })
                         .Build();
  • 如果你需要單獨使用,可通過IServiceCollection上的AddLightweightMapper方法啟用
    //實體轉換
    serviceDescriptors.AddLightweightMapper()
        .ConfigureLightweightMapper(options =>
                             {
                                //
                             });

二、配置自定義轉換邏輯

你可以通過映射設置上的AddConvert來配置對應設置實體轉換的后置邏輯,如下所示。

    //實體轉換
    serviceDescriptors.AddLightweightMapper()
        .ConfigureLightweightMapper(options =>
        {
            // 通過AddConvert可自定義轉換邏輯
            // 以下定義從SourceA轉換到TargetB時,自動設置屬性C的值
            options.AddConvert<SourceA, TargetB>((mapper, a, b) =>
            {
                b.C = "C";
            });
        });

三、使用

你可以通過IMapperProvider的GetMapper方法或IMapper<,>直接獲取Mapper實例。

  • 通過IMapperProvider
// 通過IMapperProvider
var mapperProvider = host.Services.GetRequiredService<IMapperProvider>();
var mapper = mapperProvider.GetMapper<SourceA, TargetA>();
var targetA = mapper.Convert(sourceA);
  • 通過IMapper<,>
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
var targetB = mapperB.Convert(sourceA);

四、通過特性指定屬性映射關系

默認映射按照屬性名稱進行,你也可以通過MapperPropertyNameAttribute特性進行指定。

MapperPropertyNameAttribute:

屬性名 類型 說明
Name String 目標或源的名稱
TargetType Type 映射到的目標類型
SourceType Type 映射到當前類型的來源類型

通過SourceType或TargetType你可以根據需求靈活的在源類型或目標類型上設置映射關系。

五、拷貝

實體映射也提供了拷貝方法,通過該方法可以將源實體屬性拷貝到目標實體。

  • 通過IMapper<,>的CopyTo方法進行默認拷貝:
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
var targetB1 = new TargetB();
mapperB.CopyTo(sourceA, targetB1);
  • 通過DefineCopyTo方法定義排除字段外的拷貝委托
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>();
 // 只拷貝指定字段之外的屬性
var copyProc = mapperB.DefineCopyTo(a =>
new
{
    a.A //忽略屬性A
});
var targetB2 = new TargetB();
copyProc(sourceA, targetB2);

六、示例

以上示例完整項目,請參考GitHub示例


免責聲明!

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



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