当前位置:网站首页>4. Object mapping Mapster
4. Object mapping Mapster
2022-07-05 06:14:00 【Masa technical team】
Preface
We often encounter object mapping in projects , Such as Model and Dto Mapping between , Or a deep copy of an object , We need to realize these by ourselves . here , There will be a lot of code for initializing objects in the project , The code is pretty boring to write , Is there any way to reduce our workload , So that we can spend time on business functions ?
at present ,.Net Object mapping framework in , Powerful and excellent object mapping frameworks already exist , The most used ones are :
Speaking of the object mapping framework , What people think of most is AutoMapper
, Maybe a lot of people Mapster
Never heard of it , But there's no denying it Mapster
It is really a good object mapping framework , However, due to the lack of Chinese documents , As a result, the popularity in China is not very high , Today we will introduce Mapster
What functions are provided , How to use it in a project ,Masa
Provided Mapster
What else has been done ?
Mapster brief introduction
Mapster
It's a simple to use , Powerful object mapping framework , since 2014 It's past since the year of open source 8 A year , Up to now ,github I already have 2.6k Of star, And keep it every year 3 Distribution frequency of times , Its function and AutoMapper similar , Provide object to object mapping 、 And support IQueryable Mapping to objects , And AutoMapper
comparison , Better performance in terms of speed and memory usage , You can only use 1/3 In the case of memory 4 Times performance improvement , Let's take a look at Mapster
How to use ?
preparation
Create a new console project
Assignment.Mapster
, And installMapster
dotnet add package Mapster --version 7.3.0
Map to new object
The new class
UserDto
public class UserDto{ public int Id { get; set; } public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; }}
Create a new anonymous object , As the source of the object to be converted
var user = new{ Id = 1, Name = "Tom", Gender = 1, BirthDay = DateTime.Parse("2002-01-01")};
take user The source object is mapped to the target object (UserDto)
var userDto = user.Adapt<UserDto>();Console.WriteLine($" Map to new object ,Name: {userDto.Name}");
Run the console program to verify that the conversion is successful :
data type
In addition to providing object-to-object mapping , It also supports data type conversion , Such as :
Basic types
Provide the function of type mapping , similar Convert.ChangeType()
string res = "123";decimal i = res.Adapt<decimal>(); //equal to (decimal)123;Console.WriteLine($" The result is :{i == int.Parse(res)}");
Run the console program :
Enumeration type
Map enumerations to numeric types , It also supports string to enumeration and enumeration to string mapping , Than .NET The default implementation of is twice as fast
var fileMode = "Create, Open".Adapt<FileMode>();// be equal to FileMode.Create | FileMode.OpenConsole.WriteLine($" The result of enumeration type conversion is :{fileMode == (FileMode.Create | FileMode.Open)}");
Run the console program to verify that the conversion is successful :
Queryable Expand
Mapster Provides Queryable An extension of , Used to implement DbContext On demand lookup for , for example :
The new class
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);// Use memory database , Convenient test }}
The new class
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; }}
Using a Queryable Extension method of
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();}
Run the console program to verify that the conversion is successful :
besides ,Mapster
Pre mapping is also provided / post-processing , Copy and merge and mapping configuration nesting support , Details can be viewed file , since Mapster
Already so powerful , Then I can use it directly , Why even use Masa
Provided Mapper Well ?
What is? Masa.Contrib.Data.Mapping.Mapster?
Masa.Contrib.Data.Mapping.Mapster
Is based on Mapster
An object to object mapper for , And in the original Mapster
Add auto get and use best constructor mapping based on , Support nested mapping , Reduce the workload of mapping .
Mapping rule
When the target object does not have a constructor : Use an empty constructor , Mapping to fields and attributes .
Multiple constructors exist for the target object : Get the best constructor mapping
Best constructor : The number of constructor parameters of the target object is found in descending order , The parameter names are consistent ( Case insensitive ) And the parameter type is consistent with the source object attribute
preparation
Create a new console project
Assignment.Masa.Mapster
, And installMasa.Contrib.Data.Mapping.Mapster
,Microsoft.Extensions.DependencyInjection
dotnet add package Masa.Contrib.Data.Mapping.Mapster --version 0.4.0-rc.4dotnet add package Microsoft.Extensions.DependencyInjection --version 6.0.0
The new class
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; }}
The new class
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); }}
Modify the class
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}");// Console output 49.9Console.ReadKey();
If the conversion is successful ,TotalPrice The value should be 49.9, Then we run the console program to verify whether the conversion is successful :
How to achieve
We mentioned above Masa.Contrib.Data.Mapping.Mapster
You can automatically get and use the best constructor mapping , And then complete the object to object mapping , So how does it come true ? Will it affect the performance ?
It is used to automatically obtain and use the best constructor mapping Mapster
The function of constructor mapping provided by , By specifying the constructor , Complete object to object mapping .
see file
summary
at present Masa.Contrib.Data.Mapping.Mapster
Its function is relatively weak , The current version is similar to Mapster
It only adds a function of automatically obtaining and using the best constructor , Let's easily complete the mapping when facing a class that has no empty constructor and has multiple constructors , There is no need to write an extra line of code .
But I think Masa
Version of Mapping The biggest benefit is that the project depends on BuildingBlocks
Under the IMapper
, instead of Mapster
, This makes our project separate from the specific mapper implementation , If we are asked that the project must use AutoMapper
, Just implement AutoMapper
Version of IMapper
that will do , No need to change too many business codes , Just replace the referenced package , This is also BuildingBlocks
The charm of
Source code of this chapter
Assignment04
https://github.com/zhenlei520/MasaFramework.Practice
Open source address
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
If you treat our MASA Framework Interested in , Whether it's code contribution 、 Use 、 carry Issue, Welcome to contact us
边栏推荐
- 【Rust 笔记】13-迭代器(中)
- Leetcode-6110: number of incremental paths in the grid graph
- Network security skills competition in Secondary Vocational Schools -- a tutorial article on middleware penetration testing in Guangxi regional competition
- Some common problems in the assessment of network engineers: WLAN, BGP, switch
- 1041 Be Unique
- Appium foundation - use the first demo of appium
- 1.15 - input and output system
- 1040 Longest Symmetric String
- 7. Processing the input of multidimensional features
- How to adjust bugs in general projects ----- take you through the whole process by hand
猜你喜欢
SPI details
Wazuh开源主机安全解决方案的简介与使用体验
7. Processing the input of multidimensional features
Sqlmap tutorial (II) practical skills I
wordpress切换页面,域名变回了IP地址
[practical skills] how to do a good job in technical training?
How to adjust bugs in general projects ----- take you through the whole process by hand
Redis publish subscribe command line implementation
Matrixdb V4.5.0 was launched with a new mars2 storage engine!
Wazuh開源主機安全解决方案的簡介與使用體驗
随机推荐
2022年贵州省职业院校技能大赛中职组网络安全赛项规程
Sword finger offer II 058: schedule
Leetcode stack related
Full Permutation Code (recursive writing)
One question per day 1020 Number of enclaves
Daily question 1688 Number of matches in the competition
leetcode-1200:最小绝对差
Flutter Web 硬件键盘监听
wordpress切换页面,域名变回了IP地址
Data visualization chart summary (I)
MatrixDB v4.5.0 重磅发布,全新推出 MARS2 存储引擎!
New title of module a of "PanYun Cup" secondary vocational network security skills competition
LeetCode 0107. Sequence traversal of binary tree II - another method
[rust notes] 17 concurrent (Part 2)
7. Processing the input of multidimensional features
Daily question 1984 Minimum difference in student scores
LeetCode 0108.将有序数组转换为二叉搜索树 - 数组中值为根,中值左右分别为左右子树
Appium automation test foundation - Summary of appium test environment construction
Traditional databases are gradually "difficult to adapt", and cloud native databases stand out
Dichotomy, discretization, etc