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

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

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

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

1、啓用

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

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

2、配置自定義轉換邏輯

你能夠經過映射設置上的AddConvert來配置對應設置實體轉換的後置邏輯,以下所示。設計模式

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

3、使用

你能夠經過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);

4、經過特性指定屬性映射關係

默認映射按照屬性名稱進行,你也能夠經過MapperPropertyNameAttribute特性進行指定。app

MapperPropertyNameAttribute:ide

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

經過SourceType或TargetType你能夠根據需求靈活的在源類型或目標類型上設置映射關係。性能

5、拷貝

實體映射也提供了拷貝方法,經過該方法能夠將源實體屬性拷貝到目標實體。ui

  • 經過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);

6、示例

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

相關文章
相關標籤/搜索