在分層設計模式中,各層之間的資料通常通過資料傳輸物件(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示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/270430.html
標籤:.NET Core
