当前位置:网站首页>4. 对象映射 - Mapping.Mapstercover
4. 对象映射 - Mapping.Mapstercover
2022-07-01 19:30:00 【InfoQ】
前言
- Mapster
- AutoMapper
AutoMapperMapsterMapsterMapsterMasaMapsterMapster 简介
MapsterAutoMapperMapster准备工作
- 新建一个控制台项目
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();
}

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

边栏推荐
- Flask 常用组件
- Getting started with fastdfs
- 薛定谔的日语学习小程序源码
- 《软件工程导论(第六版)》 张海藩 复习笔记
- 个人炒股怎样开户?安全吗。
- 独家消息:阿里云悄然推出RPA云电脑,已与多家RPA厂商开放合作
- C # joint Halcon application - Dahua camera acquisition class
- On the next generation entrance of the metauniverse -- the implementation of brain computer interface
- 2022安全员-A证考题及在线模拟考试
- Oracle deadlock test
猜你喜欢

图片拼图微信小程序源码_支持多模板制作和流量主

《軟件工程導論(第六版)》 張海藩 複習筆記

After adding cocoapods successfully, the header file cannot be imported or an error is reported in not found file

leetcode刷题:栈与队列02(用队列实现栈)

Richview trvdocparameters page parameter settings

合成大西瓜小游戏微信小程序源码/微信游戏小程序源码

Learn white box test case design from simple to deep

GaussDB(for MySQL) :Partial Result Cache,通过缓存中间结果对算子进行加速

2022安全员-A证考题及在线模拟考试

latex如何打空格
随机推荐
Stack overflow 2022 developer survey: where is the industry going?
运动捕捉系统原理
Past and present life of product modular design
On the next generation entrance of the metauniverse -- the implementation of brain computer interface
Richview trvdocparameters page parameter settings
安装mysql时出现:需要这两个包perl(Data::Dumper),perl(JSON)
leetcode刷题:栈与队列03(有效的括号)
寫博客文檔
PLC模拟量输入 模拟量转换FB S_ITR(三菱FX3U)
Accelera Systems Initiative是一个独立的非营利组织
天气预报小程序源码 天气类微信小程序源码
internship:逐渐迈向项目开发
Richview RichEdit srichviewedit PageSize page setup and synchronization
Target detection - Yolo series
Iframe 父子页面通信
随机头像大全,多分类带历史记录微信小程序源码_支持流量主
What if the win11 shortcut key switching input method doesn't respond? Shortcut key switching input method does not respond
想得到股票开户的优惠链接,如何得知?在线开户是安全么?
Comprehensive evaluation and detailed inventory of high-quality note taking software (I) note, obsedian, remnote, flowus
300题线性代数 第四讲 线性方程组