ASP.NET Core擴(kuò)展庫(kù)之實(shí)體映射使用詳解
在分層設(shè)計(jì)模式中,各層之間的數(shù)據(jù)通常通過(guò)數(shù)據(jù)傳輸對(duì)象(DTO)來(lái)進(jìn)行數(shù)據(jù)的傳遞,而大多數(shù)情況下,各層數(shù)據(jù)的定義結(jié)構(gòu)大同小異,如何在這些定義結(jié)構(gòu)中相互轉(zhuǎn)換,之前我們通過(guò)使用AutoMapper庫(kù),但AutoMapper功能龐大,使用較為復(fù)雜,而在很多場(chǎng)景下,可能我們只需要一些基礎(chǔ)的對(duì)象映射功能,那么此時(shí)你可以選擇擴(kuò)展庫(kù)中的輕量級(jí)AutoMapper實(shí)現(xiàn)。
實(shí)體映射包含以下核心功能:
- 在使用之前無(wú)需手動(dòng)定義類型之間的映射關(guān)系
- 采用動(dòng)態(tài)編譯、緩存轉(zhuǎn)換委托,提升性能。
- 支持通過(guò)特性定義屬性映射關(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)換
一、啟用
啟用輕量級(jí)的實(shí)體映射,有兩種方式:
- 如果你是和擴(kuò)展庫(kù)其他功能同時(shí)使用,可直接通過(guò)UseExtensions即可
using IHost host = Host.CreateDefaultBuilder()
// UseExtensions會(huì)自動(dòng)注入Mapper
.UseExtensions()
.ConfigureServices(sc =>
{
// 通過(guò)ConfigureLightweightMapper來(lái)配置映射
sc.ConfigureLightweightMapper(options =>
{
//
});
})
.Build();
- 如果你需要單獨(dú)使用,可通過(guò)IServiceCollection上的AddLightweightMapper方法啟用
//實(shí)體轉(zhuǎn)換
serviceDescriptors.AddLightweightMapper()
.ConfigureLightweightMapper(options =>
{
//
});
二、配置自定義轉(zhuǎn)換邏輯
你可以通過(guò)映射設(shè)置上的AddConvert來(lái)配置對(duì)應(yīng)設(shè)置實(shí)體轉(zhuǎn)換的后置邏輯,如下所示。
//實(shí)體轉(zhuǎn)換
serviceDescriptors.AddLightweightMapper()
.ConfigureLightweightMapper(options =>
{
// 通過(guò)AddConvert可自定義轉(zhuǎn)換邏輯
// 以下定義從SourceA轉(zhuǎn)換到TargetB時(shí),自動(dòng)設(shè)置屬性C的值
options.AddConvert<SourceA, TargetB>((mapper, a, b) =>
{
b.C = "C";
});
});
三、使用
你可以通過(guò)IMapperProvider的GetMapper方法或IMapper<,>直接獲取Mapper實(shí)例。
- 通過(guò)IMapperProvider
// 通過(guò)IMapperProvider var mapperProvider = host.Services.GetRequiredService<IMapperProvider>(); var mapper = mapperProvider.GetMapper<SourceA, TargetA>(); var targetA = mapper.Convert(sourceA);
- 通過(guò)IMapper<,>
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>(); var targetB = mapperB.Convert(sourceA);
四、通過(guò)特性指定屬性映射關(guān)系
默認(rèn)映射按照屬性名稱進(jìn)行,你也可以通過(guò)MapperPropertyNameAttribute特性進(jìn)行指定。
MapperPropertyNameAttribute:
| 屬性名 | 類型 | 說(shuō)明 |
| Name | String | 目標(biāo)或源的名稱 |
| TargetType | Type | 映射到的目標(biāo)類型 |
| SourceType | Type | 映射到當(dāng)前類型的來(lái)源類型 |
通過(guò)SourceType或TargetType你可以根據(jù)需求靈活的在源類型或目標(biāo)類型上設(shè)置映射關(guān)系。
五、拷貝
- 實(shí)體映射也提供了拷貝方法,通過(guò)該方法可以將源實(shí)體屬性拷貝到目標(biāo)實(shí)體。
通過(guò)IMapper<,>的CopyTo方法進(jìn)行默認(rèn)拷貝:
var mapperB = host.Services.GetRequiredService<IMapper<SourceA, TargetB>>(); var targetB1 = new TargetB(); mapperB.CopyTo(sourceA, targetB1);
- 通過(guò)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);
六、示例
以上示例完整項(xiàng)目,請(qǐng)參考GitHub示例
以上就是ASP.NET Core擴(kuò)展庫(kù)之實(shí)體映射使用詳解的詳細(xì)內(nèi)容,更多關(guān)于ASP.NET Core擴(kuò)展庫(kù)之實(shí)體映射的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- ASP.NET Core擴(kuò)展庫(kù)之Http請(qǐng)求模擬功能的使用
- ASP.NET Core擴(kuò)展庫(kù)之Http通用擴(kuò)展庫(kù)的使用詳解
- ASP.NET Core實(shí)現(xiàn)自動(dòng)依賴注入
- ASP.NET Core中使用令牌桶限流的實(shí)現(xiàn)
- ASP.NET Core自動(dòng)生成小寫(xiě)破折號(hào)路由的實(shí)現(xiàn)方法
- 如何在ASP.NET Core中使用HttpClientFactory
- 如何在ASP.Net Core中使用Serilog
- ASP.NET Core 5中如何生成PDF文檔
- ASP.NET Core中使用LazyCache的全過(guò)程
- ASP.NET Core快速入門(mén)之環(huán)境篇
相關(guān)文章
ASP.NET實(shí)現(xiàn)個(gè)人信息注冊(cè)頁(yè)面并跳轉(zhuǎn)顯示
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)個(gè)人信息注冊(cè)頁(yè)面并跳轉(zhuǎn)顯示的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
a.sp.net清除ListBox的列表項(xiàng)(刪除所有項(xiàng)目)
在網(wǎng)上搜索相關(guān)資料,相當(dāng)多用戶有相同要求,一次移除ListBox的列表所有項(xiàng)2012-01-01
使用ASP.NET MVC引擎開(kāi)發(fā)插件系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了使用ASP.NET MVC引擎開(kāi)發(fā)插件系統(tǒng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
ASP.NET Core對(duì)不同類型的用戶進(jìn)行區(qū)別限流詳解
這篇文章主要介紹了ASP.NET Core對(duì)不同類型的用戶進(jìn)行區(qū)別限流的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
ASP.NET MVC5網(wǎng)站開(kāi)發(fā)之展示層架構(gòu)(五)
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC5網(wǎng)站開(kāi)發(fā)之展示層架構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
asp.net core實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了asp.net core實(shí)現(xiàn)文件上傳功能,怎么做單文件和多文件上傳,感興趣的小伙伴們可以參考一下2016-06-06
你應(yīng)該知道的.NET錯(cuò)誤與異常處理機(jī)制
這篇文章主要給大家介紹了關(guān)于.NET錯(cuò)誤與異常處理機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.NET具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
asp.net使用LINQ to SQL連接數(shù)據(jù)庫(kù)及SQL操作語(yǔ)句用法分析
這篇文章主要介紹了asp.net使用LINQ to SQL連接數(shù)據(jù)庫(kù)及SQL操作語(yǔ)句用法,較為詳細(xì)的分析了LINQ操作sql語(yǔ)句的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-05-05

