不用AutoMapper,我用啥呢?
dotNET全栈开发
共 3613字,需浏览 8分钟
· 2022-04-19
微信公众号:趣编程ACE
关注可了解更多的.NET日常实战开发技巧。如需源码请后台留言源码;
**[如果觉得对您有帮助,欢迎关注]
TinyMapper简介
本文来自社区群粉丝投稿
TinyMapper是一个.NET平台下的一个轻量级对象映射工具,号称是.Net平台下最快的对象映射组件,性能是AutoMapper的6倍。今天我们来在.Net6下演示如何快速使用这个组件。
官网地址:http://tinymapper.net/
安装
1.新建一个Web Api项目
2.安装Nuget包
创建实体以及映射类型
1.新建一个Model类,里面包括数据库实体和DTO
namespace TinymapperDemo.Models
{
///
/// 数据库实体DTO
///
public class PersonDto
{
public string? Name { get; set; }
public string? Address { get; set; }
public string? Phone { get; set; }
}
///
/// 数据库实体 用的 record 类型标记
///
///
///
///
///
///
public record Person(int Id,
string UserName,
string City,
string Street,
string Phone);
}
从数据库获取实体数据
新建一个UserManger类,代替仓储模拟从数据库获取实体数据
public class UserManage : IUserManage
{
///
/// 模拟从数据库获取数据
///
///
public Person[] GetPerson()
{
return new[] {
new Person(1,"Jarry","Suzhou","Guan qian","1232322323"),
new Person(1,"Test","Suzhou","Shan tang","3232324332")
};
}
}
namespace TinymapperDemo.Services
{
public interface IUserManage
{
Person[] GetPerson();
}
}
服务获取
生成UserService服务,提供给API接口调用
namespace TinymapperDemo.Services
{
public class UserService:IUserService
{
private readonly IUserManage userManage;
public UserService(IUserManage userManage)
{
this.userManage = userManage;
}
public PersonDto GetPersonDto(string name)
{
var persons = userManage.GetPerson();
var model =persons.FirstOrDefault(f => f.UserName.IndexOf(name) >= 0);
// 常规转化方法如下
//return new PersonDto()
//{
// Name = model?.UserName,
// Address = model?.City + model?.Street,
// Phone = model?.Phone
//};
// 使用TinyMapper 转化
// 除了下面这步转化呢 还需要再Program.cs 里面配置一下 TinyMapper.Bind(); // 必不可省
return TinyMapper.Map(model);
}
}
public interface IUserService
{
PersonDto GetPersonDto(string name);
}
}
服务注册
builder.Services.AddSingleton(); // 注册仓储
builder.Services.AddSingleton(); // 注册服务
TinyMapper.Bind(); // 必不可省
额外用法
1:对于TinyMapper简单类转化用法,我们可以手动配置,比如:
// Person 为实体 PersonDto 为Dto 实体转化到Dto
TinyMapper.Bind(c =>
{
c.Ignore(f => f.Id); // 忽略字段
c.Bind(s => s.UserName, d => d.Name);
c.Bind(s => s.City, d => d.Address);
c.Bind(s => s.Phone, d => d.Phone);
}
);
2.对于复杂字段,我们可以自定义转化配置:用法如下:
首先新建一个转化类:CustomConveter 继承TypeConverter这个抽象类。
public class CustomConveter: TypeConverter {}
接着重写两个基方法 CanConvertTo ConvertTo
public class CustomConveter: TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext? context, Type? destinationType)
{
return destinationType== typeof(PersonDto);
}
public override object? ConvertTo(ITypeDescriptorContext? context, CultureInfo? culture, object? value, Type destinationType)
{
var conveterValue = value as Person;
var personDto = new PersonDto
{
Address = conveterValue?.City + conveterValue?.Street, // 地址拼接为 城市+街道的形式
Phone = conveterValue?.Phone,
Name = conveterValue?.UserName
};
return personDto;
}
}
最后我们在实体类上绑上上面写好的自定义转化特性
[TypeConverter(typeof(CustomConveter))]
public record Person(int Id,
string UserName,
string City,
string Street,
string Phone);
大功告成。。。。。。以上就是官网演示的方法,我在.Net6 平台上面复现了一下,感谢观阅!
评论
我看阿里的年终奖总算发了!
到4月底了,这两天看朋友圈,发现阿里的年终奖终于发了,问了问老同学,也从网上检索了不少信息,基本搞清楚了阿里今年的年终奖情况。近来来阿里一些集团对绩效等级做了较大的调整,以前的旧绩效系统中,绩效分为3.25、3.5、3.75、4和5五个等级,其中4和5是较高绩效等级,较少见。而且之前3.5绩效内部划
公子龙
0
老爸嘲讽我了,写破代码一年就挣十几万,他在工地带50个工人,一个月光人头费就3万,让我滚回去跟他干!
点击上方 "大数据肌肉猿"关注, 星标一起成长点击下方链接,进入高质量学习交流群今日更新| 1052个转型案例分享-大数据交流群来自:网络,侵删有个网友的父亲是做工程的,天天就嘲笑他,说他天天写着破代码有啥用,一年就拿个十多万的死工资,然后告诉他自己在工地里面带了50个工人,一个月能抽三万
程序源代码
0
我发现 Lombok的几个骚操作,哈哈好用
大家好,我是小富~前言本文不讨论对错,只讲骚操作。有的方法看看就好,知道可以这么用,但是否应用到实际开发中,那就仁者见仁,智者见智了。一万个读者就会有一万个哈姆雷特,希望这篇文章能够给您带来一些思考。耐心看完,你一定会有所收获。@onX例如 onConstructor, oMet
程序员内点事
0
聊一聊我最常关注的9个计算机视觉、自动驾驶、AI方向高质量圈子
随着计算机视觉(2D/3D)、SLAM、自动驾驶、AI技术的快速迭代更新,可落地的技术也成为人们争先学习的重点。这使得从业者对于最前沿技术的获取能力变得至关重要。微信公众号便是一个非常有效的前沿信息分享平台。这里给大家推荐9个最常打开的计算机视觉、自动驾驶、SLAM、机器学习和AI方向的优质公众号平
机器学习初学者
0
我想写几个专栏,欢迎大家投票
大家好,我是章北海前段时间更新了一个专栏,阅读和订阅都极不理想,看起来是没有做好调研啊。准备启动新的专栏更新计划了,我有几个选题,看大家更喜欢哪一个呢?欢迎投票,拜谢!
机器学习算法与Python实战
0
我发现这款浏览器真不错
“软件分享”只分享好玩有趣的黑科技软件很多人都知道我的电脑安装了10款浏览器,每一款浏览器都有自己的分工,国内外的浏览器基本都用过,今天我又发现了一款浏览器。下载用了一下午感觉还很符合国内用户使用,这款浏览器叫CentBrowser(百分浏览器)。可以说是谷歌浏览器增强版吧。Cent Browser
一锅汤软件
2
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
35K*14 薪入职了,这公司只要不裁员,我能一直呆下去。。
大家好,我是R哥。说说最近的面试辅导,有个学员进了某个知名互联网公司,拿到了 35K*14 薪的好成绩,有不少粉丝留言问我,现在行情这么差,他是怎么做到的?这篇拿他这个案例完整回顾一下吧,我管他叫小Y吧。背景沟通说下小Y的基本情况吧:小Y工作 5 年+,空窗期2个月+,5 年干了 3 家单位,学历不
Java技术栈
0