AutoMapper

先说说DTO

DTO是个什么东东?

DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已。

为什么要用DTO?

1、DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层

2、DTO是面向UI的需求而设计的,而领域模型是面向业务而设计的。因此DTO更适合于和表现层的交互,通过DTO我们实现了表现层与领域Model之间的解耦,因此改动领域Model不会影响UI层

3、DTO说白了就是数据而已,不包含任何的业务逻辑,属于瘦身型的对象,使用时可以根据不同的UI需求进行灵活的运用

AutoMapper

现在我们既然知道了使用DTO的好处,那么我们肯定也想马上使用它,但是这里会牵扯一个问题:怎样实现DTO和领域Model之间的转换?

有两个思路,我们要么自己写转换代码,要么使用工具。不过就应用而言,我还是觉得用工具比较简单快捷,那就使用工具吧。其实这样的转换工具很多,不过我还是决定使用AutoMapper,因为它足够轻量级,而且也非常流行,国外的大牛们都使用它。使用AutoMapper可以很方便的实现DTO和领域Model之间的转换,它是一个强大的Object-Object Mapping工具。

一、如何添加AutoMapper到项目中?

在vs中使用打开工具-库程序包管理器-程序包管理控制平台,输入“Install-Package AutoMapper”命令,就可以把AutoMapper添加到项目中了~

二、吃点栗子

栗子1(两个类型之间的映射)

Mapper.CreateMap<AddressDto, Address>();AddressDto dto = new AddressDto{Country = "China",City = "ShangHai",Street = "JinZhong Street"};
Address address = Mapper.Map<AddressDto,Address>(Dto);

栗子2(两个映射的对象有部分字段名称不一样)

AddressDto到Address的映射,AddressDto的字段CountryName要对应Address的字段Country:

Mapper.CreateMap<AddressDto, Address>(). ForMember(d => d.Country, opt => opt.MapFrom(s => s.CountryName));

栗子3(列表类型之间的映射)

源类型List<Address>,目标类型List<AddressDto>:

AutoMapper.Mapper.CreateMap< Address, AddressDto >();
var addressDtoList = AutoMapper.Mapper.Map<List< Address >, List< AddressDto >>( addressList);

栗子4(映射在增改查中的应用)

public class ProductBll{Public IProductRepository productRepository{ set; get; }public ProductDTO CreateProduct(ProductDTO productDTO){Mapper.CreateMap<ProductDTO, Product>();Product product = Mapper.Map<ProductDTO, Product>(productDTO);productRepository.AddProduct(product);return productDTO;}

public List<ProductDTO> GetProduct(){Mapper.CreateMap<Product, ProductDTO>();List<ProductDTO> arr = new List<ProductDTO>();productRepository.GetProduct().ForEach(i =>{arr.Add(Mapper.Map<Product, ProductDTO>(i));});return arr;}public ProductDTO ModifyProduct(ProductDTO productDTO){Mapper.CreateMap<ProductDTO, Product>();Product product = Mapper.Map<ProductDTO, Product>(productDTO);productRepository.ModifyProduct(product);return productDTO;} }

三、让AutoMapper使用变得简单

吃过上面的栗子,你觉得怎么样呢?如果想继续吃,那就去查看AutoMapper的具体API文档吧!倘若在项目中真正要用的时候,我觉得还是应该对AutoMapper的方法进行一些整理,最好能够封装一下,这里我通过扩展方法的形式将其封装为AutoMapperHelper,这样以后使用AutoMapper就变的SO EASY了~

using System.Collections;
using System.Collections.Generic;
using System.Data;
using AutoMapper;
namespace Infrastructure.Utility{/// <summary>/// AutoMapper扩展帮助类/// </summary>public static class AutoMapperHelper{/// <summary>///  类型映射/// </summary>
public static T MapTo<T>(this object obj){if (obj == null) return default(T);Mapper.CreateMap(obj.GetType(), typeof(T));return Mapper.Map<T>(obj);}/// <summary>/// 集合列表类型映射/// </summary>
public static List<TDestination> MapToList<TDestination>(this IEnumerable source){foreach (var first in source){var type = first.GetType();Mapper.CreateMap(type, typeof(TDestination));break;}return Mapper.Map<List<TDestination>>(source);}/// <summary>/// 集合列表类型映射/// </summary>
public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source){//IEnumerable<T> 类型需要创建元素的映射Mapper.CreateMap<TSource, TDestination>();return Mapper.Map<List<TDestination>>(source);}/// <summary>/// 类型映射/// </summary>
public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)where TSource : classwhere TDestination : class{if (source == null) return destination;Mapper.CreateMap<TSource, TDestination>();return Mapper.Map(source, destination);}/// <summary>/// DataReader映射/// </summary>
public static IEnumerable<T> DataReaderMapTo<T>(this IDataReader reader){Mapper.Reset();Mapper.CreateMap<IDataReader, IEnumerable<T>>();return Mapper.Map<IDataReader, IEnumerable<T>>(reader);}} }

你可以像下面的栗子这样使用:

//对象映射
ShipInfoModel shipInfoModel = ShipInfo.MapTo<ShipInfoModel>();
//列表映射
List< ShipInfoModel > shipInfoModellist = ShipInfoList.MapToList<ShipInfoModel>();

小结

在项目中多使用DTO实现表现层与领域Model的解耦,用AutoMapper来实现DTO与领域Model的相互转换

转载于:https://www.cnblogs.com/yanglang/p/6902360.html

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

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

相关文章

Wildfly Swarm,朝着成熟和一小部分贡献

我最近关注的项目之一是Wildfly Swarm 。 最终&#xff0c;在今年的JBoss BOF Devoxx期间&#xff0c;我的考虑更改项目名称的请求没有通过&#xff08;由于与著名的Docker Swarm发生冲突&#xff09;。 那么什么是Wildfly Swarm&#xff1f; 简而言之&#xff0c;就是Wildfly…

oracle10 数据库审计,Oracle数据库审计用法实例

本节是从ORACLE METALINK的DOC:167293.1翻译整理而来的。通过举例的方式来说明ORACLE审计的用法。ORACLE的审计可以从语句级、对象本节是从Oracle METALINK的DOC:167293.1翻译整理而来的。通过举例的方式来说明ORACLE审计的用法。ORACLE的审计可以从语句级、对象级和权限级几个…

cefsharp 发送请求服务器_超高性能管线式HTTP请求(实践·原理·实现)

来源:https://www.cnblogs.com/lulianqi/p/8167526.html这里的高性能指的就是网卡有多快请求发送就能有多快&#xff0c;基本上一般的服务器在一台客户端的压力下就会出现明显延时。该篇实际是介绍pipe管线的原理&#xff0c;下面主要通过其高性能的测试实践&#xff0c;解析背…

(Oracle)DDL及其数据泵导入导出(impdp/expdp)

create tablespace ybp_dev datafile G:\app\Administrator\oradata\health\ybp_dev1.dbf size 10m autoextend on;create user 用户名 default tablespace 表空间名 identified by 用户密码;grant connect,resource to 用户;测试连接 conn mpi/1234删除表空间 drop tablespace…

查看oracle的块大小,查看操作系统块大小

查看操作系统块大小oracle建库一般设置数据库块大小8192K&#xff0c;一般是OS块大小的整数倍&#xff0c;要避免数据库块大小小于系统块大小的情况。1.在WINDOWS系统上&#xff0c;可以用命令fsutil来查看&#xff0c;测试如下&#xff1a;C:\Documents and Settings\administ…

java jsr_分叉并加入Java 7 – JSR 166并发实用程序

java jsrJava 7最有趣的改进之一是对并发的更好支持。 借助JSR 166并发实用程序&#xff0c;我们获得了一些非常有用的并发改进。 在我看来&#xff0c;fork-join库在软件工程中具有很高的实际应用潜力。 Fork and join为算法提供了非常简单的编程模型&#xff0c;可以将其实现…

python标准库模块_Python标准库模块之heapq

该模块提供了堆排序算法的实现。堆是二叉树&#xff0c;最大堆中父节点大于或等于两个子节点&#xff0c;最小堆父节点小于或等于两个子节点。 创建堆 heapq有两种方式创建堆&#xff0c; 一种是使用一个空列表&#xff0c;然后使用heapq.heappush()函数把值加入堆中&#xff0…

quartz Cron-Expression的表达式

关于quartz Cron-Expression的表达式&#xff0c;这个博客写的很好 ttp://www.cnblogs.com/yaowen/p/3779284.html CronTrigger配置完整格式为&#xff1a; [秒] [分] [小时] [日] [月] [周] [年] Q&#xff1a; C# quartz设置job间隔5min执行一次 A:0 30/5 16 * * ? 每…

oracle 启用闪回数据库,如何启用Oracle10g闪回数据库特性

为什么80%的码农都做不了架构师&#xff1f;>>>1.确认当前模式SYS AS SYSDBA on 29-MAR-05 >select flashback_on from v$database;FLA---NO2.检查/修改恢复区设置SYS AS SYSDBA on 29-MAR-05 >show parameter db_recovery_file_destNAME TYPE VALUE-----------…

nvme通用驱动_对领域驱动设计的理解与实践

领域驱动设计(Domain-Driven-Design)是一种针对大型复杂系统的领域建模与分析方法论。2003 年&#xff0c;Eric Evans 发布《Domain-Driven Design: Tackling Complexity in the Heart of Software》(领域驱动设计&#xff1a;软件核心复杂性应对之道)&#xff0c;其中定义了DD…

为什么不应该用Stream forEach替换for循环的3个原因

太棒了&#xff01; 我们正在将代码库迁移到Java8。我们将用函数替换所有内容。 扔掉设计模式。 删除面向对象。 对&#xff01; 我们走吧&#xff01; 等一下 Java 8已经问世了一年多&#xff0c;而这种兴奋又回到了日常业务中。 baeldung.com从2015年5月开始执行的一项非代…

Obj文件格式

obj文件是wavefront公司定义的3d模型文本格式数据文件 只支持模型三角面数据和材质信息&#xff0c;无动画功能支持 其中几何信息由.obj文件提供&#xff0c;材质信息由.mtl文件定义 文件以行为单位表示一条数据&#xff0c;可以根据行开头的字符判断后续的内容 其中 # 字符表示…

python通讯录综合_Python通讯录作业

我知道你们懒,代码直接贴到下面了&#xff0c;附上流程图#通讯录管理 #coding:utf-8 Mail{} print( ——————通讯录————— |1.添加联系人 | |2.删除联系人 | |3.查询联系人 | |4.更新联系人 | |5.退出通讯录 | ________________ ) while True: bhinput(请输入编号选择对…

使用NPOI库导入导出EXCEL

一、EXCEL 导入&#xff08;Excel 导入导出实际项目中会被封装成**Helper 本示例只对简单功能做演示&#xff09; NPOI 包引用 视图view {ViewBag.Title "NPOIExcel"; }<h2>NPOIExcel</h2> <form action"Url.Action("NPOIInport", &…

oracle12c ora 12547,Oracle 12c DBCA出现PRCR-1079 ORA-12547 CRS-5017

Oracle 12c用dbca创建数据库时出现了PRCR-1079 ORA-12547 CRS-5017不能启动数据库。因为这里安装了Oracle Restart&#xff0c;所以尝试使用srvctl start database命令来手动启动数据库&#xff0c;但是结果还是一样不能启动。[gridoracle12c 12.1]$ srvctl start database -db…

kmeans鸢尾花分类python代码_python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

一.分散性聚类(kmeans) 算法流程: 1.选择聚类的个数k. 2.任意产生k个聚类&#xff0c;然后确定聚类中心&#xff0c;或者直接生成k个中心。 3.对每个点确定其聚类中心点。 4.再计算其聚类新中心。 5.重复以上步骤直到满足收敛要求。&#xff08;通常就是确定的中心点不再改变。…

akka_Akka的字数统计MapReduce

akka在我与Akka的日常工作中&#xff0c;我最近写了一个字数映射减少示例。 本示例实现了Map Reduce模型&#xff0c;该模型非常适合横向扩展设计方法。 流 客户端系统&#xff08;FileReadActor&#xff09;读取文本文件&#xff0c;并将每一行文本作为消息发送给ClientActor…

Log4j 2配置与IntelliJ IDEA控制台颜色

Log4j是Java平台上最好的日志组件了&#xff0c;Log4j 2升级了不少API&#xff0c;拓展性更好。使用的话只需要直接引入就可以了. <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> &…

用c3p0连接oracle怎么分页,JSP分页(MySql+c3p0+dbutils)

JSP分页(MySqlc3p0dbutils)来源&#xff1a;互联网作者&#xff1a;佚名时间&#xff1a;2015-02-16 17:27为什么要对数据进行分页&#xff1f;当数据较多时&#xff0c;页面就会变的很庞大&#xff0c;不仅会影响到用户的使用&#xff0c;而且还有加重服务器的负担。下面简单的…

用python自动发邮件_Python实现向QQ群成员自动发邮件的方法

#coding:utf-8 import random import smtplib from email.mime.text import MIMEText import time def send_mail(mailto): print Setting MIMEText CTopen(content.txt,r) #读取发送邮件内容 contentCT.read().decode(utf-8) msgMIMEText(content.encode(utf8),_subtypehtml) …