ASP.NET Core擴展庫之實體映射使用詳解
在分層設(shè)計模式中,各層之間的數(shù)據(jù)通常通過數(shù)據(jù)傳輸對象(DTO)來進行數(shù)據(jù)的傳遞,而大多數(shù)情況下,各層數(shù)據(jù)的定義結(jié)構(gòu)大同小異,如何在這些定義結(jié)構(gòu)中相互轉(zhuǎn)換,之前我們通過使用AutoMapper庫,但AutoMapper功能龐大,使用較為復(fù)雜,而在很多場景下,可能我們只需要一些基礎(chǔ)的對象映射功能,那么此時你可以選擇擴展庫中的輕量級AutoMapper實現(xiàn)。
實體映射包含以下核心功能:
- 在使用之前無需手動定義類型之間的映射關(guān)系
- 采用動態(tài)編譯、緩存轉(zhuǎn)換委托,提升性能。
- 支持通過特性定義屬性映射關(guān)系
- 支持插入自定義的轉(zhuǎn)換處理方法
- 支持列表轉(zhuǎn)換
- 支持嵌套類型轉(zhuǎn)換
- 支持循環(huán)引用及引用關(guān)系維持
- 支持轉(zhuǎn)換模式或拷貝模式
- 支持生成預(yù)定義的拷貝委托
- 為了保持其輕量性,目前支持以下轉(zhuǎn)換
值類型轉(zhuǎn)換
數(shù)值類型之間的兼容轉(zhuǎn)換(如int-->uint)
支持值類型與其可空類型間的兼容轉(zhuǎn)換
字典類型轉(zhuǎn)換
列表類型轉(zhuǎn)換
枚舉類型與string類型間的轉(zhuǎn)換
不支持結(jié)構(gòu)體之間的轉(zhuǎn)換以及結(jié)構(gòu)體與類之間的轉(zhuǎn)換
一、啟用
啟用輕量級的實體映射,有兩種方式:
- 如果你是和擴展庫其他功能同時使用,可直接通過UseExtensions即可
using IHost host = Host.CreateDefaultBuilder() // UseExtensions會自動注入Mapper .UseExtensions() .ConfigureServices(sc => { // 通過ConfigureLightweightMapper來配置映射 sc.ConfigureLightweightMapper(options => { // }); }) .Build();
- 如果你需要單獨使用,可通過IServiceCollection上的AddLightweightMapper方法啟用
//實體轉(zhuǎn)換 serviceDescriptors.AddLightweightMapper() .ConfigureLightweightMapper(options => { // });
二、配置自定義轉(zhuǎn)換邏輯
你可以通過映射設(shè)置上的AddConvert來配置對應(yīng)設(shè)置實體轉(zhuǎn)換的后置邏輯,如下所示。
//實體轉(zhuǎn)換 serviceDescriptors.AddLightweightMapper() .ConfigureLightweightMapper(options => { // 通過AddConvert可自定義轉(zhuǎn)換邏輯 // 以下定義從SourceA轉(zhuǎn)換到TargetB時,自動設(shè)置屬性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);
四、通過特性指定屬性映射關(guān)系
默認映射按照屬性名稱進行,你也可以通過MapperPropertyNameAttribute特性進行指定。
MapperPropertyNameAttribute:
屬性名 | 類型 | 說明 |
Name | String | 目標或源的名稱 |
TargetType | Type | 映射到的目標類型 |
SourceType | Type | 映射到當前類型的來源類型 |
通過SourceType或TargetType你可以根據(jù)需求靈活的在源類型或目標類型上設(shè)置映射關(guān)系。
五、拷貝
- 實體映射也提供了拷貝方法,通過該方法可以將源實體屬性拷貝到目標實體。
通過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擴展庫之實體映射使用詳解的詳細內(nèi)容,更多關(guān)于ASP.NET Core擴展庫之實體映射的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在ASP.NET?MVC下限制同一個IP地址單位時間間隔內(nèi)的請求次數(shù)的解決方法
有時候,當用戶請求一個Controller下的Action,我們希望,在單位時間間隔內(nèi),比如每秒,每分鐘,每小時,每天,每星期,限制同一個IP地址對某個Action的請求次數(shù),如何做呢?這篇文章主要介紹了在ASP.NET?MVC下限制同一個IP地址單位時間間隔內(nèi)的請求次數(shù),需要的朋友可以參考下2024-01-01C# 中使用iTextSharp組件創(chuàng)建PDF的簡單方法
C# 中使用iTextSharp組件創(chuàng)建PDF的簡單方法,需要的朋友可以參考一下2013-03-03ASP.NET Core中的響應(yīng)壓縮的實現(xiàn)
這篇文章主要介紹了ASP.NET Core中的響應(yīng)壓縮的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08.NET中讀取Excel文件的數(shù)據(jù)及excelReader應(yīng)用
輕量,快速的C#編寫的庫讀取Microsoft Excel文件,這對讀取大量excel文件的朋友們很有幫助而且可以學(xué)習(xí)下ExcelDataReader的應(yīng)用,感興趣的朋友可以了解下,或許對你有所幫助2013-02-02xpath的數(shù)據(jù)和節(jié)點類型以及XPath中節(jié)點匹配的基本方法
xpath的數(shù)據(jù)和節(jié)點類型以及XPath中節(jié)點匹配的基本方法,學(xué)習(xí)xpath的朋友可以參考下。2010-09-09jquery.pagination +JSON 動態(tài)無刷新分頁實現(xiàn)代碼
jquery.pagination +JSON 動態(tài)無刷新分頁實現(xiàn)代碼,需要的朋友可以參考下。2011-12-12