在分層設計模式中,各層之間的數據一般經過數據傳輸對象(DTO)來進行數據的傳遞,而大多數狀況下,各層數據的定義結構大同小異,如何在這些定義結構中相互轉換,以前咱們經過使用AutoMapper庫,但AutoMapper功能龐大,使用較爲複雜,而在不少場景下,可能咱們只須要一些基礎的對象映射功能,那麼此時你能夠選擇擴展庫中的輕量級AutoMapper實現。git
實體映射包含如下核心功能:github
啓用輕量級的實體映射,有兩種方式:c#
using IHost host = Host.CreateDefaultBuilder() // UseExtensions會自動注入Mapper .UseExtensions() .ConfigureServices(sc => { // 經過ConfigureLightweightMapper來配置映射 sc.ConfigureLightweightMapper(options => { // }); }) .Build();
//實體轉換 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 var mapperProvider = host.Services.GetRequiredService<IMapperProvider>(); var mapper = mapperProvider.GetMapper<SourceA, TargetA>(); var targetA = mapper.Convert(sourceA);
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>(); var targetB = mapperB.Convert(sourceA);
默認映射按照屬性名稱進行,你也能夠經過MapperPropertyNameAttribute特性進行指定。app
MapperPropertyNameAttribute:ide
屬性名 | 類型 | 說明 |
---|---|---|
Name | String | 目標或源的名稱 |
TargetType | Type | 映射到的目標類型 |
SourceType | Type | 映射到當前類型的來源類型 |
經過SourceType或TargetType你能夠根據需求靈活的在源類型或目標類型上設置映射關係。性能
實體映射也提供了拷貝方法,經過該方法能夠將源實體屬性拷貝到目標實體。ui
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>(); var targetB1 = new TargetB(); mapperB.CopyTo(sourceA, targetB1);
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示例設計