国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

4. 對象映射 - Mapping.Mapster

這篇具有很好參考價值的文章主要介紹了4. 對象映射 - Mapping.Mapster。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

在項目中我們會經(jīng)常遇到對象的映射,比如像Model和Dto之間的映射,或者是對象的深拷貝,這些都是需要我們自己實現(xiàn)的。此時,項目中會出現(xiàn)很多初始化對象的代碼,這些代碼寫起來相當?shù)目菰锓ξ?,那么有沒有什么辦法減輕我們的工作量,使得我們可以把時間花費到業(yè)務功能上呢?

目前,.Net中的對象映射框架,功能強大且性能極佳的對象映射框架已經(jīng)存在,其中使用最多的有:

  • Mapster
  • AutoMapper

說到對象映射框架,大家想到的最多的是AutoMapper,可能很多人連Mapster都沒聽過,但不可否認的是Mapster確實是一個很好的對象映射框架,但由于中文文檔的缺失,導致在國內(nèi)知名度不是很高,今天我們就來介紹一下Mapster提供了哪些功能,如何在項目中使用它,Masa提供的Mapster又做了什么?

Mapster 簡介

Mapster是一個使用簡單,功能強大的對象映射框架,自2014年開源到現(xiàn)在已經(jīng)過去8個年頭,截止到現(xiàn)在,github上已經(jīng)擁有2.6k的star,并保持著每年3次的發(fā)版頻率,其功能與AutoMapper類似,提供對象到對象的映射、并支持IQueryable到對象的映射,與AutoMapper相比,在速度和內(nèi)存占用方面表現(xiàn)的更加優(yōu)秀,可以在只使用1/3內(nèi)存的情況下獲得4倍的性能提升,那我們下面就來看看Mapster如何使用?

準備工作

  • 新建一個控制臺項目Assignment.Mapster,并安裝Mapster

    dotnet add package Mapster --version 7.3.0
    

映射到新對象

  1. 新建類UserDto

    public class UserDto
    {
        public int Id { get; set; }
    
        public string Name { get; set; }
    
        public uint Gender { get; set; }
    
        public DateTime BirthDay { get; set; }
    }
    
  2. 新建一個匿名對象,作為待轉(zhuǎn)換的對象源

    var user = new
    {
        Id = 1,
        Name = "Tom",
        Gender = 1,
        BirthDay = DateTime.Parse("2002-01-01")
    };
    
  3. 將user源對象映射到為目標對象 (UserDto)

    var userDto = user.Adapt<UserDto>();
    Console.WriteLine($"映射到新對象,Name: {userDto.Name}");
    

運行控制臺程序驗證轉(zhuǎn)換成功:
4. 對象映射 - Mapping.Mapster

數(shù)據(jù)類型

除了提供對象到對象的映射,還支持數(shù)據(jù)類型的轉(zhuǎn)換,如:

基本類型
  • 提供類型映射的功能,類似Convert.ChangeType()

    string res = "123";
    decimal i = res.Adapt<decimal>(); //equal to (decimal)123;
    Console.WriteLine($"結(jié)果為:{i == int.Parse(res)}");
    

運行控制臺程序: 4. 對象映射 - Mapping.Mapster

枚舉類型
  • 把枚舉映射到數(shù)字類型,同樣也支持字符串到枚舉和枚舉到字符串的映射,比.NET的默認實現(xiàn)快兩倍

    var fileMode = "Create, Open".Adapt<FileMode>();//等于 FileMode.Create | FileMode.Open
    Console.WriteLine($"枚舉類型轉(zhuǎn)換的結(jié)果為:{fileMode == (FileMode.Create | FileMode.Open)}");
    

運行控制臺程序驗證轉(zhuǎn)換成功:
4. 對象映射 - Mapping.Mapster

Queryable擴展

Mapster提供了Queryable的擴展,用于實現(xiàn)DbContext的按需查找,例如:

  1. 新建類UserDbContext

    using Assignment.Mapster.Domain;
    using Microsoft.EntityFrameworkCore;
    
    namespace Assignment.Mapster.Infrastructure;
    
    public class UserDbContext : DbContext
    {
        public DbSet<User> User { get; set; }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            var dataBaseName = Guid.NewGuid().ToString();
            optionsBuilder.UseInMemoryDatabase(dataBaseName);//使用內(nèi)存數(shù)據(jù)庫,方便測試
        }
    }
    
  2. 新建類User

    public class User
    {
        public int Id { get; set; }
    
        public string Name { get; set; }
    
        public uint Gender { get; set; }
    
        public DateTime BirthDay { get; set; }
    
        public DateTime CreationTime { get; set; }
    
        public User()
        {
            CreationTime = DateTime.Now;
        }
    }
    
  3. 使用基于Queryable的擴展方法ProjectToType

    using (var dbContext = new UserDbContext())
    {
        dbContext.Database.EnsureCreated();
    
        dbContext.User.Add(new User()
        {
            Id = 1,
            Name = "Tom",
            Gender = 1,
            BirthDay = DateTime.Parse("2002-01-01")
        });
        dbContext.SaveChanges();
    
        var userItemList = dbContext.User.ProjectToType<UserDto>().ToList();
    }
    

運行控制臺程序驗證轉(zhuǎn)換成功:
4. 對象映射 - Mapping.Mapster

除此之外,Mapster還提供了映射前/后處理,拷貝與合并以及映射配置嵌套支持,詳細可查看文檔,既然Mapster已經(jīng)如此強大,那我直接使用它就可以了,為什么還要使用Masa提供的Mapper呢?

什么是Masa.Contrib.Data.Mapping.Mapster?

Masa.Contrib.Data.Mapping.Mapster是基于Mapster的一個對象到對象的映射器,并在原來Mapster的基礎上增加自動獲取并使用最佳構(gòu)造函數(shù)映射,支持嵌套映射,減輕映射的工作量。

映射規(guī)則

  • 目標對象沒有構(gòu)造函數(shù)時:使用空構(gòu)造函數(shù),映射到字段和屬性。

  • 目標對象存在多個構(gòu)造函數(shù):獲取最佳構(gòu)造函數(shù)映射

    最佳構(gòu)造函數(shù): 目標對象構(gòu)造函數(shù)參數(shù)數(shù)量從大到小降序查找,參數(shù)名稱一致(不區(qū)分大小寫)且參數(shù)類型與源對象屬性一致

準備工作

  • 新建一個控制臺項目Assignment.Masa.Mapster,并安裝Masa.Contrib.Data.Mapping.Mapster,Microsoft.Extensions.DependencyInjection

    dotnet add package Masa.Contrib.Data.Mapping.Mapster --version 0.4.0-rc.4
    dotnet add package Microsoft.Extensions.DependencyInjection --version 6.0.0
    
  1. 新建類OrderItem

    public class OrderItem
    {
        public string Name { get; set; }
    
        public decimal Price { get; set; }
    
        public int Number { get; set; }
    
        public OrderItem(string name, decimal price) : this(name, price, 1)
        {
    
        }
    
        public OrderItem(string name, decimal price, int number)
        {
            Name = name;
            Price = price;
            Number = number;
        }
    }
    
  2. 新建類Order

    public class Order
    {
        public string Name { get; set; }
    
        public decimal TotalPrice { get; set; }
    
        public List<OrderItem> OrderItems { get; set; }
    
        public Order(string name)
        {
            Name = name;
        }
    
        public Order(string name, OrderItem orderItem) : this(name)
        {
            OrderItems = new List<OrderItem> { orderItem };
            TotalPrice = OrderItems.Sum(item => item.Price * item.Number);
        }
    }
    
  3. 修改類Program

    using Assignment.Masa.Mapster.Domain.Aggregate;
    using Masa.BuildingBlocks.Data.Mapping;
    using Masa.Contrib.Data.Mapping.Mapster;
    using Microsoft.Extensions.DependencyInjection;
    
    Console.WriteLine("Hello Masa Mapster!");
    
    IServiceCollection services = new ServiceCollection();
    services.AddMapping();
    
    var request = new
    {
        Name = "Teach you to learn Dapr ……",
        OrderItem = new OrderItem("Teach you to learn Dapr hand by hand", 49.9m)
    };
    var serviceProvider = services.BuildServiceProvider();
    var mapper = serviceProvider.GetRequiredService<IMapper>();
    var order = mapper.Map<Order>(request);
    
    Console.WriteLine($"{nameof(Order.TotalPrice)} is {order.TotalPrice}");//控制臺輸出49.9
    
    Console.ReadKey();
    

如果轉(zhuǎn)換成功,TotalPrice的值應該是49.9,那么我們運行控制臺程序來驗證轉(zhuǎn)換是否成功:

4. 對象映射 - Mapping.Mapster

如何實現(xiàn)

上面我們提到了Masa.Contrib.Data.Mapping.Mapster可以自動獲取并使用最佳構(gòu)造函數(shù)映射,進而完成對象到對象的映射,那么它是如何實現(xiàn)的呢?會不會對性能有什么影響呢?

做到自動獲取并使用最佳構(gòu)造函數(shù)映射是使用的Mapster提供的構(gòu)造函數(shù)映射的功能,通過指定構(gòu)造函數(shù),完成對象到對象的映射。

查看文檔

總結(jié)

目前Masa.Contrib.Data.Mapping.Mapster的功能相對較弱,當前版本與Mapster的相比僅僅增加了一個自動獲取并使用最佳構(gòu)造函數(shù)的功能,讓我們在面對無空構(gòu)造函數(shù)且擁有多個構(gòu)造函數(shù)的類時也能輕松的完成映射,不需要額外多寫一行代碼。

但我覺得Masa版的Mapping最大的好處是項目依賴的是BuildingBlocks下的IMapper,而不是Mapster,這也就使得我們的項目與具體的映射器實現(xiàn)脫離,如果我們被要求項目必須要使用AutoMapper,只需要實現(xiàn)AutoMapper版的IMapper即可,無需更改太多的業(yè)務代碼,僅需要更換一下引用的包即可,這也是BuildingBlocks的魅力所在

本章源碼

Assignment04

https://github.com/zhenlei520/MasaFramework.Practice

開源地址

MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks

MASA.Contrib:https://github.com/masastack/MASA.Contrib

MASA.Utils:https://github.com/masastack/MASA.Utils

MASA.EShop:https://github.com/masalabs/MASA.EShop

MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor

如果你對我們的 MASA Framework 感興趣,無論是代碼貢獻、使用、提 Issue,歡迎聯(lián)系我們文章來源地址http://www.zghlxwxcb.cn/news/detail-442496.html

到了這里,關(guān)于4. 對象映射 - Mapping.Mapster的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • 【Elasticsearch學習筆記二】es的Mapping字段映射、Mapping字段常用類型、Mapping映射的創(chuàng)建、查看和更新、es數(shù)據(jù)遷移、ik分詞器

    【Elasticsearch學習筆記二】es的Mapping字段映射、Mapping字段常用類型、Mapping映射的創(chuàng)建、查看和更新、es數(shù)據(jù)遷移、ik分詞器

    目錄 1、Mapping字段映射概述 2、Mapping字段常用類型 3、映射中對時間類型詳解 1)采取自動映射器來映射 2)手工映射提前指定日期類型 4、ES的keyword的屬性ignore_above 5、Mapping映射的查看和創(chuàng)建 1)查看mapping信息:GET 索引名/_mapping 2)創(chuàng)建映射:PUT /索引名 3)?查看所有索引映

    2024年01月20日
    瀏覽(27)
  • (4)Mapping(映射)

    映射是定義文檔及其包含的字段的存儲和索引方式的過程。 兩種映射方式 dynamic mapping(動態(tài)映射或自動映射) expllcit mapping(靜態(tài)映射或手工映射或顯示映射) Mapping數(shù)據(jù)類型 Mapping參數(shù) https://www.elastic.co/guide/en/elasticsearch/reference/7.10/removal-of-types.html Mapping 也稱之為映射,定義

    2024年02月01日
    瀏覽(17)
  • Mapping映射入門

    Mapping映射入門

    概念:自動或手動為index中的_doc建立的一種數(shù)據(jù)結(jié)構(gòu)和相關(guān)配置,簡稱為mapping映射。 插入幾條數(shù)據(jù),讓es自動為我們建立一個索引 對比數(shù)據(jù)庫建表語句 動態(tài)映射:dynamic mapping,自動為我們建立index,以及對應的mapping,mapping中包含了每個field對應的數(shù)據(jù)類型,以及如何分詞等

    2023年04月08日
    瀏覽(19)
  • (4)elasticsearch的Mapping(映射)

    映射是定義文檔及其包含的字段的存儲和索引方式的過程。 兩種映射方式 dynamic mapping(動態(tài)映射或自動映射) expllcit mapping(靜態(tài)映射或手工映射或顯示映射) Mapping數(shù)據(jù)類型 Mapping參數(shù) https://www.elastic.co/guide/en/elasticsearch/reference/7.10/removal-of-types.html Mapping 也稱之為映射,定義

    2024年02月03日
    瀏覽(63)
  • 深入理解Elasticsearch的索引映射(mapping)

    當我們談論Elasticsearch時,索引映射是一個核心概念,它定義了如何存儲和檢索數(shù)據(jù)。在Elasticsearch 7.6及更高版本中,映射提供了一系列強大的功能,使您能夠精確地控制數(shù)據(jù)的結(jié)構(gòu)和行為。本文將詳細介紹映射的關(guān)鍵屬性、用途以及如何正確設置和優(yōu)化它。 在Elasticsearch中,

    2024年02月22日
    瀏覽(39)
  • Elasticsearch學習-索引操作及Mapping映射

    在7.X版本前類似于關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)庫概念,8.X版本后刪除了type概念,索引類似于關(guān)系型數(shù)據(jù)庫中的表 相當于關(guān)系型數(shù)據(jù)庫中的一條數(shù)據(jù),最小單元 每一個節(jié)點就是一個ES實例(一個java進程),一個節(jié)點 != 一臺服務器 多個節(jié)點組成分布式系統(tǒng),ES原生分布式,已啟動一

    2023年04月22日
    瀏覽(23)
  • Elasticsearch:映射(mapping)的實用實踐指南

    Elasticsearch:映射(mapping)的實用實踐指南

    動態(tài)映射適用于開發(fā)環(huán)境,但對于生產(chǎn)級集群禁用它。 將動態(tài)配置為 “strict” 以對索引的字段值實施嚴格模式。有關(guān)動態(tài)映射的詳細描述,請閱讀文章 “Elasticsearch:Dynamic mapping”。 當文檔大量存儲時,可以在定義字段映射時使用優(yōu)化來節(jié)省磁盤空間。 禁用強制(coerce)。

    2024年02月12日
    瀏覽(17)
  • elasticsearch中文檔映射Mapping用法詳解

    elasticsearch中文檔映射Mapping用法詳解

    Mapping類似數(shù)據(jù)庫中的schema的定義,作用如下: 定義索引中的字段的名稱 定義字段的數(shù)據(jù)類型,例如字符串,數(shù)字,布爾等 字段,倒排索引的相關(guān)配置(Analyzed or Not Analyzed,Analyzer) ES中Mapping映射可以分為動態(tài)映射和靜態(tài)映射。 動態(tài)映射: ????????在關(guān)系數(shù)據(jù)庫中,需要事先創(chuàng)

    2024年02月16日
    瀏覽(29)
  • Elasticsearch:Explicit mapping - 顯式映射

    Elasticsearch:Explicit mapping - 顯式映射

    顯式映射相比較動態(tài)映射(Dynamic mapping)是需要我們在索引創(chuàng)建時就定義字段及其類型。這個和我們傳統(tǒng)的 RDMS 數(shù)據(jù)庫一樣,在我們寫入數(shù)據(jù)到數(shù)據(jù)庫之前,我們需要工整地定義好每個字段及其類型和長度。Elasticsearch 既可以使用顯式映射也可以同時使用動態(tài)映射。在許多的

    2024年02月02日
    瀏覽(23)
  • es elasticsearch 八 mapping 映射 、復雜數(shù)據(jù)類型

    es elasticsearch 八 mapping 映射 、復雜數(shù)據(jù)類型

    目錄 Mapping 映射 復雜數(shù)據(jù)類型 Mapping 映射 精確匹配 必須和對應字段值安全一致才可查出 全文檢索 縮寫搜索全程、格式轉(zhuǎn)換 大小寫 同義詞 全文檢索核心原理 分詞,初步的倒排索引的建立 重建倒排索引 時態(tài)轉(zhuǎn)換、重復數(shù)的轉(zhuǎn)換、同義詞的轉(zhuǎn)換、大小寫的轉(zhuǎn)換 分詞器 analy

    2024年02月07日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包