ASP.NET Core擴充套件庫之實體對映使用詳解
阿新 • • 發佈:2021-03-18
在分層設計模式中,各層之間的資料通常通過資料傳輸物件(DTO)來進行資料的傳遞,而大多數情況下,各層資料的定義結構大同小異,如何在這些定義結構中相互轉換,之前我們通過使用AutoMapper庫,但AutoMapper功能龐大,使用較為複雜,而在很多場景下,可能我們只需要一些基礎的物件對映功能,那麼此時你可以選擇擴充套件庫中的輕量級AutoMapper實現。
實體對映包含以下核心功能:
- 在使用之前無需手動定義型別之間的對映關係
- 採用動態編譯、快取轉換委託,提升效能。
- 支www.cppcns.com持通過特性定義屬性對映關係
- 支援插入自定義的轉換處理方法
- 支援列表轉換
- 支援巢狀型別轉換
- 支援迴圈引用及引用關係維持
- 支援轉換模式或拷貝模式
- 支援生成預定義的拷貝委託
- 為了保持其輕量性,目前支援以下轉換
值型別轉換
數值型別之間的相容轉換(如int-->uint)
支援值型別與其可空型別間的相容轉換
字典型別轉換
列表型別轉換
列舉型別與string型別間的轉換
不支援結構體之間的轉換以及結構體與類之間的轉換
一、啟用
啟用輕量級的實體對映,有兩種方式:
- 如果你是和擴充套件庫其他功能同時使用,可直接通過UseExtensions即可
using IHost host = Host.CreateDefaultBuilder() // UseExtensions會自動注入Mapper .UseExtensions() .ConfigureServices(sc => {程式設計客棧 // 通過ConfigureLightweightMapper來配置對映 sc.ConfigureLightweightMapper(options => { // www.cppcns.com }); }) .Build();
- 如果你需要單獨使用,可通過IServiceCollection上的AddLightweightMapper方法啟用
//實體轉換 serviceDescriptors.AddLightweightMapper() .ConfigureLightweightMapper(options => { // });
二、配置自定義轉換邏輯
你可以通過對映設定上的AddConvert來配置對應設定實體轉換的後置邏輯,如下所示。
//實體轉換
serviceDescriptors.AddLightweightMapper()
.Confhttp://www.cppcns.comigureLightweightMapper(options =>
{
// 通過AddConvert可自定義轉換邏輯
// 以下定義從SourceA轉換到TargetB時,自動設定屬性C的值
options.AddConvert<SourceA,TargetB>((mapper,a,b) =&ghttp://www.cppcns.comt;
{
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示例
以上就是ASP.NET Core擴充套件庫之實體對映使用詳解的詳細內容,更多關於ASP.NET Core擴充套件庫之實體對映的資料請關注我們其它相關文章!