当前位置:网站首页>4. 对象映射 - Mapping.Mapstercover
4. 对象映射 - Mapping.Mapstercover
2022-07-01 19:30:00 【InfoQ】
前言
- Mapster
- AutoMapper
AutoMapper
Mapster
Mapster
Mapster
Masa
Mapster
Mapster 简介
Mapster
AutoMapper
Mapster
准备工作
- 新建一个控制台项目
Assignment.Mapster
,并安装Mapster
dotnet add package Mapster --version 7.3.0
映射到新对象
- 新建类
UserDto
public class UserDto
{
public int Id { get; set; }
public string Name { get; set; }
public uint Gender { get; set; }
public DateTime BirthDay { get; set; }
}
- 新建一个匿名对象,作为待转换的对象源
var user = new
{
Id = 1,
Name = "Tom",
Gender = 1,
BirthDay = DateTime.Parse("2002-01-01")
};
- 将user源对象映射到为目标对象 (UserDto)
var userDto = user.Adapt<UserDto>();
Console.WriteLine($"映射到新对象,Name: {userDto.Name}");

数据类型
基本类型
- 提供类型映射的功能,类似Convert.ChangeType()
string res = "123";
decimal i = res.Adapt<decimal>(); //equal to (decimal)123;
Console.WriteLine($"结果为:{i == int.Parse(res)}");

枚举类型
- 把枚举映射到数字类型,同样也支持字符串到枚举和枚举到字符串的映射,比.NET的默认实现快两倍
var fileMode = "Create, Open".Adapt<FileMode>();//等于 FileMode.Create | FileMode.Open
Console.WriteLine($"枚举类型转换的结果为:{fileMode == (FileMode.Create | FileMode.Open)}");

Queryable扩展
- 新建类
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);//使用内存数据库,方便测试
}
}
- 新建类
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;
}
}
- 使用基于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();
}

Mapster
Mapster
Masa
什么是Masa.Contrib.Data.Mapping.Mapster?
Masa.Contrib.Data.Mapping.Mapster
Mapster
Mapster
映射规则
- 目标对象没有构造函数时:使用空构造函数,映射到字段和属性。
- 目标对象存在多个构造函数:获取最佳构造函数映射
- 最佳构造函数: 目标对象构造函数参数数量从大到小降序查找,参数名称一致(不区分大小写)且参数类型与源对象属性一致
准备工作
- 新建一个控制台项目
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
- 新建类
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;
}
}
- 新建类
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);
}
}
- 修改类
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();

如何实现
Masa.Contrib.Data.Mapping.Mapster
Mapster
总结
Masa.Contrib.Data.Mapping.Mapster
Mapster
Masa
BuildingBlocks
IMapper
Mapster
AutoMapper
AutoMapper
IMapper
BuildingBlocks
本章源码
开源地址

边栏推荐
- [multithreading] lock strategy
- 《軟件工程導論(第六版)》 張海藩 複習筆記
- 薛定谔的日语学习小程序源码
- 想请教一下,券商选哪个比较好尼?本人小白不懂,现在网上开户安全么?
- On the next generation entrance of the metauniverse -- the implementation of brain computer interface
- 关于new Set( )还有哪些是你不知道的
- [multithreading] realize the singleton mode (hungry and lazy) realize the thread safe singleton mode (double validation lock)
- 新版图解网络PDF即将发布
- 8K HDR!| Hevc hard solution for chromium - principle / Measurement Guide
- 2022安全员-A证考题及在线模拟考试
猜你喜欢
NSI脚本的测试
Data analysts sound tall? Understand these points before you decide whether to transform
On the next generation entrance of the metauniverse -- the implementation of brain computer interface
Powerful, easy-to-use, professional editor / notebook software suitable for programmers / software developers, comprehensive evaluation and comprehensive recommendation
RichView TRVDocParameters 页面参数设置
leetcode刷题:栈与队列05(逆波兰表达式求值)
EURA eurui E1000 series inverter uses PID to realize the relevant parameter setting and wiring of constant pressure water supply function
大厂做狼,小厂做狗?
Getting started with fastdfs
How to turn off the boot auto start software in win11
随机推荐
Iframe parent-child page communication
利用QEventLoop实现同步等待槽函数返回
300题线性代数 第四讲 线性方程组
internship:复杂json格式数据编写接口
BC35&BC95 ONENET MQTT(旧)
UVM教程
芭比Q了!新上架的游戏APP,咋分析?
喜马拉雅自研网关架构演进过程
Gaussdb (for MySQL):partial result cache, which accelerates the operator by caching intermediate results
internship:逐渐迈向项目开发
Oracle 死锁测试
Write blog documents
Win11 how to hide the taskbar? Win11 method to hide the taskbar
EDA工具对芯片产业的重要性知识科普
强大的万年历微信小程序源码-支持多做流量主模式
Common components of flask
leetcode刷题:栈与队列01(用栈实现队列)
RichView TRVDocParameters 页面参数设置
PHP gets the external chain address of wechat applet and applet store
Architect graduation summary