【C#/.NET】不用AutoMapper,我用啥呢?

微信公众号:趣编程ACE
关注可了解更多的.NET日常实战开发技巧。如需源码请后台留言源码;
**[如果觉得对您有帮助,欢迎关注]

TinyMapper简介

本文来自社区群粉丝投稿

TinyMapper是一个.NET平台下的一个轻量级对象映射工具,号称是.Net平台下最快的对象映射组件,性能是AutoMapper的6倍。今天我们来在.Net6下演示如何快速使用这个组件。

278f00bafadb2357173d7d54be41310c.png

官网地址:http://tinymapper.net/

安装

1.新建一个Web Api项目

ac5675231eaabfc17c151d18f2d7c2a1.png

2.安装Nuget包

38ed7956cf0aedce85b70f00a502cceb.png

创建实体以及映射类型

1.新建一个Model类,里面包括数据库实体和DTO

namespace TinymapperDemo.Models
{/// <summary>/// 数据库实体DTO/// </summary>public class PersonDto {public string? Name { get; set; }public string? Address { get; set; }public string? Phone { get; set; }}/// <summary>/// 数据库实体 用的 record 类型标记/// </summary>/// <param name="Id"></param>/// <param name="UserName"></param>/// <param name="City"></param>/// <param name="Street"></param>/// <param name="Phone"></param>public record Person(int Id,string UserName,string City,string Street,string Phone);}

从数据库获取实体数据

新建一个UserManger类,代替仓储模拟从数据库获取实体数据

public class UserManage : IUserManage
{/// <summary>/// 模拟从数据库获取数据/// </summary>/// <returns></returns>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<Person, PersonDto>();  // 必不可省return TinyMapper.Map<PersonDto>(model);}}public interface IUserService{PersonDto GetPersonDto(string name);}
}

服务注册

builder.Services.AddSingleton<IUserManage, UserManage>();  // 注册仓储
builder.Services.AddSingleton<IUserService, UserService>();  // 注册服务TinyMapper.Bind<Person, PersonDto>();  // 必不可省

额外用法

1:对于TinyMapper简单类转化用法,我们可以手动配置,比如:

// Person 为实体  PersonDto 为Dto 实体转化到Dto 
TinyMapper.Bind<Person, PersonDto>(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 平台上面复现了一下,感谢观阅!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HBase键值分片的简单运用

1.基本原理介绍 HBase的存储是通过行键建立索引进行存储的&#xff0c;而且HBase只支持一级索引&#xff0c;因此只要通过行键才能很快的找到需要的数据。HBase是一个分布式的系统&#xff0c;HBase通过行键的分片&#xff0c;把不同的数据存储在不同的主机上。1).顺序分片依据…

我要3万取款机怎么取_7万的新宝骏RS-3怎么样?用车三个月后,车主说出了实话...

小型SUV领域&#xff0c;作为目前SUV市场之中竞争最激烈的细分领域之一&#xff0c;已经成为众多车企的必争之地。而正因如此&#xff0c;小型SUV市场所具有的车型非常的丰富&#xff0c;且其中更是一点也不缺爆款车型&#xff0c;正如在去年底刚上市的一款小型SUV——新宝骏RS…

MODIS数据说明

MODIS目前主要存在于两颗卫星上&#xff1a;TERRA和AQUA。TERRA卫星每日地方时上午10:30时过境&#xff0c;因此也把它称作地球观测第一颗上午星(EOS-AM1)。AQUA每日地方时下午过境&#xff0c;因此称作地球观测第一颗下午星(EOS-PM1)。两颗星相互配合&#xff0c;每1-2天可重复…

.NET 为大型应用接入 ApplicationStartupManager 启动流程框架

对于大型的应用软件&#xff0c;特别是客户端应用软件&#xff0c;应用启动过程中&#xff0c;需要执行大量的逻辑&#xff0c;包括各个模块的初始化和注册等等逻辑。大型应用软件的启动过程都是非常复杂的&#xff0c;而客户端应用软件是对应用的启动性能有所要求的&#xff0…

思科为其核心网络业务增加了订阅服务

据国外媒体报道&#xff0c;思科系统公司的核心网络业务于周二开始进军订阅服务市场&#xff0c;其向大型企业宣布了一系列新的安全和自动化工具。 这个新的“直观网络”代表了思科如何从其旗舰业务中获得收入的重大变化。San Jose公司一直依赖于网络设备的销售&#xff0c;这些…

if函数python_pythonif函数

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; python的内置的函数round() a 1.12586 #保留小数的函数,四舍五入&#xff0c;参数为保留小数点后的位数 pr…

Foundatio - .Net Core用于构建分布式应用程序的可插拔基础块

简介Foundatio - 用于构建分布式应用程序的可插拔基础块•想要针对抽象接口进行构建&#xff0c;以便我们可以轻松更改实现。希望这些块对依赖注入友好。•缓存&#xff1a;我们最初使用的是开源 Redis 缓存客户端&#xff0c;但后来它变成了具有高许可成本的商业产品。不仅如此…

开讲啦观后感2017计算机科学家,开讲啦观后感2017

1 开讲啦观后感2017(一)是因为有爱&#xff0c;我才付出的&#xff0c;因为是我爱的&#xff0c;而我又付出了&#xff0c;所以我会更爱。这是郑教授的演讲《你为什么读大学》中给我映像最深刻的一句话。我也能从这句话中找到我读大学的原因因为我爱。古时候说你十年寒窗苦读&a…

php 解压zip

2019独角兽企业重金招聘Python工程师标准>>> /*** 解压zip* param type $file* param type $destination* return boolean*/public function unzip_file($file, $destination){ $zip new ZipArchive() ; if ($zip->open($file) ! TRUE) {return $this->error…

如何评价国内SRC纷纷上线“白帽子协议”?

2017年6月1日21:21分 某监狱里&#xff0c;对话如下&#xff1a; 犯人A:你们都是怎么来的&#xff1f; 犯人B:我是XX漏洞平台挖漏洞不小心进来的。 犯人C:我是XX平台路人甲&#xff0c;输错命令了rm -rf / &#xff08;批量删除&#xff09; 犯人D:我是某测评中心的忘了要授权了…

SQL Server数据库备份的镜像

SQL Server数据库备份的镜像 原文:SQL Server数据库备份的镜像SQL Server数据库备份的镜像 一个完整备份可以分开镜像 USE master GOBACKUP DATABASE [testdatabase] TO DISK NC:\testdatabase1.bak MIRROR TO DISK ND:\testdatabase2.bak WITH FORMAT, INIT GO 一个完整备份…

C# 观察文件的更改

使用 FileSystemWatcher 可以监视文件的更改。事件在创建、重命名、删除和更改文件时触发。这可用于如下场景&#xff1a;需要对文件的变更做出反应&#xff0c;例如&#xff0c;服务器上传文件时&#xff0c;或文件缓存在内存中&#xff0c;而缓存需要在文件更改时失效。因为 …

php 自动创建目录

2019独角兽企业重金招聘Python工程师标准>>> /*** 创建目录* param type $path* param type $mode* return type */public function rmkdir($path, $mode 0777) {return is_dir($path) || ( $this->rmkdir(dirname($path), $mode) && $this->_mkdir(…

油管螺纹尺寸对照表_yt15硬质合金刀片尺寸|A320焊接刀头参数

硬质合金刀片牌号表示方法如下图&#xff1a;yw1硬质合金刀片a320钨钛钴类硬质合金主要成分是碳化钨、碳化钛(TiC)及钴。其牌号由“YT”(“硬、钛”两字汉语拼音字首)和碳化钛平均含量组成。例如&#xff0c;YT15&#xff0c;表示平均碳化钛(TiC)15%&#xff0c;其余为碳化钨和…

python实验原理_Python实验报告八

安徽工程大学Python程序设计 班级&#xff1a;物流192 姓名&#xff1a;唐家豪 学号&#xff1a;3190505234 成绩&#xff1a; 日期&#xff1a;2020/06/03 指导老师&#xff1a;修宇 【实验目的】 &#xff1a; 掌握读写文本文件或 CSV 文件&#xff0c;进而对数据进行处理的方…

.NET 6 使用 Obfuscar 进行代码混淆

本文来安利大家 Obfuscar 这个好用的基于 MIT 协议开源的混淆工具。这是一个非常老牌的混淆工具&#xff0c;从 2014 年就对外分发&#xff0c;如今已有累计 495.5K 的 nuget 下载量。而且此工具也在不断持续迭代更新&#xff0c;完全支持 dotnet 6 版本&#xff0c;对 WPF 和 …

springmvc 传对象报400_那么火的SpringMVC到底有什么过人之处呢

先简单聊聊SpringMVC如果你们玩知乎&#xff0c;很可能会看到我的身影。我经常会去知乎水回答。在知乎有很多初学者都会问的一个问题&#xff1a;「我学习SpringMVC需要什么样的基础」我一定会让他们先学Servlet&#xff0c;再学SpringMVC的。虽然说我们在现实开发中几乎不会写…

matlab cftool代码_Matlab工具箱之拟合算法

和插值算法相比&#xff0c;拟合算法的优势在于拟合曲线不需要经过所有样本点&#xff0c;所以能降低函数的复杂程度。我们可以通过观察散点图目测拟合函数的大致形式&#xff0c;然后用最小二乘法计算待估参数。这时候Matlab就能发挥作用了&#xff0c;因为它提供了非常强大的…

WPF效果第一百七十八篇ItemsControl旋转

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题、玩…

结对开发Ⅴ——循环一维数组求和最大的子数组

一、设计思路 &#xff08;1&#xff09;数据的存储结构是链表&#xff0c;最后一个结点的next指向第一个元素的结点&#xff1b; &#xff08;2&#xff09;数据个数为n&#xff0c;则最多有n*(n(n-1)...1)种情况&#xff08;包括重复&#xff09;&#xff1b; &#xff08;3&…