AutoMapper 使用实践

一.   使用意图

       常常在开发过程中,碰到一个实体上的属性值,要赋值给另外一个相类似实体属性时,且属性有很多的情况。一般不利用工具的话,就要实例化被赋值实体B,然后再将实体A的字段一个个赋值给B的属性,单单写这些没有技术含量的赋值语句,就要用很大的代码篇幅。假如做得好一点的话,一般就是利用反射的方式,将A属性赋值给B,当然用反射的话,要顺利将A的属性,赋值B的属性,这样确实能够减少代码篇幅,那就要有一些约束或者限制,例如属性名称要相同,属性的数据类型要相同,这样反射起来才不费力。那如何使反射起来,更加灵活,可配置,且配置和反射过程能够分离,实现职责单一,AutoMapper 就是这样一个开源类库。

二.   认识AutoMapper

官方地址 :http://automapper.org/

GitHub 地址:https://github.com/AutoMapper/AutoMapper 包含AutoMapper 源代码与应用Simple。

开发指南:https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

从我开发过程使用到一些场景

  1. 实体->实体

  2. 集合->集合

  3. 实体字段名称不同

  4. 实体数据类型不同

  5. 相同名称,相同数据类型无需配置

  6. 有Queryable Extensions ,也即支持Entity Framework

三.   最佳实践

AutoMapper开发指南,有详细的介绍,我这里就不再搬过说了,大家有空自己研究研究,我这里主要介绍一下AutoMapper比较好的实践方式,废话不多说,直接做项目给大家看。

  1. 项目结构

 

每个项目用途,解决方案文件夹基本标示清楚。

    2. 以订单为例(不是真实业务,只是举个简单的例子),在Models 实体类库 新增OrderModel模型,在ViewModels 新增OrderViewModel模型,代码在下面

using System;namespace Models
{    

  public class OrderModel{    
       public Guid OrderGuid { get; set; }      
       public string OrderNo { get; set; }
       public string OrderCreator { get; set; }
       public DateTime OrderDateTime { get; set; }
       public string OrderStatus { get; set; }
       public string Description { get; set; }
       public string Creator { get; set; }
       public DateTime CreateDateTime { get; set; }
        public string LastModifier { get; set; }
        public DateTime LastModifiedDateTime { get; set; }} }
using System;
namespace ViewModels {  
   public class OrderViewModel{  
        public Guid OrderGuid { get; set; }    
          public string OrderNo { get; set; }    
           public string OrderCreator { get; set; }
           public DateTime OrderDateTime { get; set; }
            public string OrderStatus { get; set; }  
            public string Description { get; set; } } }


这里假设ViewModel,在使用过程中,不需要创建与修改相关的字段。

3. AutoMapper 配置

通过NuGet 程序包管理器,下载AutoMapper Dll,右键-》AutoMapperProfiles 类库-》管理NuGet程序包-》联机-》右上角搜索“AutoMapper” 下载安装

新增 ModelToViewModelProfile,ViewModelToModelProfile 两个配置类,继承AutoMapper 的 Profile 类,实现Configure重载方法,并分别引入Models & ViewModels 类库,ModelToViewModelProfile,ViewModelToModelProfile 代码如下

using AutoMapper;
using Models;
using ViewModels;

namespace AutoMapperProfiles {  
   public class ModelToViewModelProfile:Profile{        
      protected override void Configure(){CreateMap<OrderModel, OrderViewModel>();}} }


using AutoMapper;
using Models;
using ViewModels;
namespace AutoMapperProfiles {  
 public class ViewModelToModelProfile : Profile{      
   protected override void Configure(){CreateMap<OrderViewModel, OrderModel>();}} }

4.注册配置

在AutoMapperRegister 项目中,新增AutoMapperProfileRegister 类,按照 第3点,安装一下AutoMapper,同时引用AutoMapperProfiles 类库。代码如下


using AutoMapper;
using AutoMapperProfiles

namespace AutoMapperRegister {  
  public class AutoMapperProfileRegister{      
      public static void Register(){Mapper.Configuration.AddProfile(new ModelToViewModelProfile());Mapper.Configuration.AddProfile(new ViewModelToModelProfile());}} }

5. 控制台验证是否能够顺利转换

按照 第3点,安装一下AutoMapper,引入 AutoMapperRegister ,Models,ViewModels Dll,编写测试代码,代码如下(见证奇迹的时候到了)

using System;
using System.Collections.Generic;
using System.Linq;using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using AutoMapperRegister;
using Models;
using ViewModels;

namespace ConsoleAutoMapperSample {    
  class Program{      
     static void Main(string[] args){AutoMapperProfileRegister.Register();        
         var order = new OrderModel{OrderGuid = Guid.NewGuid(),OrderNo = "201604020001",OrderCreator = "david",OrderDateTime = DateTime.Now,OrderStatus = "已出库",Description = "请提供个人发票"};          
            var orderView = Mapper.Map<OrderModel, OrderViewModel>(order);orderView.OrderStatus = "已完成";        
            var updateOrder = Mapper.Map<OrderViewModel, OrderModel>(orderView);}} }

经过追踪对象属性变化,全部转换成功,不方便截图,稍后我会放出源代码。



原文地址:http://www.cnblogs.com/davidzhou/p/5347556.html



.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注


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

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

相关文章

kafka可靠数据传递

【README】 本文阐述了kafka可靠消息传递机制&#xff1b; 本文部分内容总结于《kafka权威指南》&#xff08;一本好书&#xff0c;墙裂推荐&#xff09;&#xff0c;再加上自己的理解&#xff1b; 【1】可靠性保证 1&#xff0c;在讨论可靠性时&#xff0c;一般使用保证这个…

JAVA面试常考系列二

转载自 JAVA面试常考系列二 题目一 解释一下线程和进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上…

雨滴桌面时间插件_Win10美化向——如何搭配你的桌面

// 2020-02-11 //桌面这个东西大家肯定不陌生了&#xff0c;很多人的桌面都如下。_______滑动查看更多图片这多重水印是什么鬼&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;还有很多网友呢&#xff0c;也美化了一下自己的桌面。不过呢严格来说&#xff0c;这应…

python画建筑_专题 | Python 绘图入门

我的施工之路Python 绘图入门这是施工系列第18篇&#xff0c;同时也进入到一个新的阶段&#xff1a;Python绘图篇。作为绘图模块的第一篇&#xff0c;与大家一起过过最基本的Python绘图原理。掌握基本的绘图原理很有必要&#xff0c;各个常用绘图库的原理基本都是相通的。所以了…

最新版dotnet-cli下的ASP.NET Core和asp.net mvc【RC2尝鲜】

RC1是http://get.asp.net里面提供的https://docs.asp.net/en/latest/getting-started/index.html&#xff0c;使用旧的ASP.NET Core 1.0。这个版本会使用dnvm&#xff0c;dnu restore和dnx web等&#xff0c;而RC2则不需要&#xff0c;RC2只需要dotnet restore和dotnet run&…

kafka生产者开发方式

【README】 本文记录了 kafka生产者开发方式&#xff1b; 【1】生产者概览 【1.1】kafka发送消息过程 【1.2】创建kafka生产者 1&#xff09;创建kafka生产者&#xff0c; 有3个必选属性&#xff1a; bootstrap.servers&#xff1a; kakfa集群节点地址&#xff1b;key.seri…

JAVA面试常考系列三

转载自 JAVA面试常考系列三 题目一 什么是迭代器(Iterator)&#xff1f; 迭代器&#xff08;iterator&#xff09;是一种对象&#xff0c;它能够用来遍历标准模板库容器中的部分或全部元素&#xff0c;每个迭代器对象代表容器中确定的地址。迭代器提供了一种方法&#xff0c;可…

linux wait函数头文件_手把手教Linux驱动9-等待队列waitq

在上一篇《手把手教Linux驱动8-Linux IO模型》我们已经了解了阻塞、非阻塞、同步和异步等相关概念&#xff0c;本文主要讲解如何通过等待队列实现对进程的阻塞。应用场景&#xff1a;当进程要获取某些资源(例如从网卡读取数据)的时候&#xff0c;但资源并没有准备好(例如网卡还…

HoloLens开发手记-配置开发环境 Install the tools

随着Build 2016开发者大会的结束&#xff0c;HoloLens开发包也正式开放下载。Hololens没有独立的SDK&#xff0c;开发特性被集成到最新的Visual Studio Update 2中。如果你没有HoloLens真机&#xff0c;那么可以安装HoloLens模拟器。 安装清单 注意: 这里为了方便大家顺利下载安…

kafka再均衡监听器测试

【README】 本文使用的kafka是最新的 kafka3.0.0&#xff1b;本文kafka集群有3个节点分别是 centos201, centos202, centos203 &#xff1b; brokerid 分别为 1,2&#xff0c;3&#xff1b;本文主要用于测试 再均衡监听器&#xff1b;当有新消费者加入时&#xff0c;会发生分区…

java面试常考系列四

转载自 java面试常考系列四 题目一 大O符号(big-O notation)的作用是什么&#xff1f;有哪些使用方法&#xff1f; 大O符号描述了当数据结构里面的元素增加的时候&#xff0c;算法的规模或者是性能在最坏的场景下有多么好。大O符号也可用来描述其他的行为&#xff0c;比如&…

用python进行自然语言处理_Python自然语言处理示例:SVM和贝叶斯分类

❝关于自然语言处理(NLP)方面的文章、书籍非常之多&#xff0c;对于自然语言处理的上手&#xff0c;很多人是不知所措的。通过对本文的浏览&#xff0c;您应该能够对自然语言处理会有一个能够完整的有趣的基于Python的对自然语言处理的了解。❞什么是文本分类文本分类是将文本按…

Build 2016,你可能忽视的几个细节

微软公司主办的Build 2016大会尚在进程中&#xff0c;但是两场重量级的主题演讲已经结束。下面列举了我个人非常关注的几个细节&#xff0c;介绍一些背景知识以饲读者。 Bash on Windows背后的历史和未来 微软和IBM二十多年前联合开发NT内核的时候就已经为接驳多种操作系统留下…

JAVA面试常考系列五

转载自 JAVA面试常考系列五 题目一 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么&#xff1f;吞吐量收集器使用并行版本的新生代垃圾收集器&#xff0c;它用于中等规模和大规模数据的应用程序。串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存…

kafka消费者开发方式小结

【README】 1&#xff0c; 本文总结了 kafka消费者开发方式&#xff1b;2&#xff0c; 本文使用的是最新的kafka版本 3.0.0&#xff1b;【1】 kafka消费则 【1.1】消费者与消费者组 1&#xff09;消费者&#xff1a; 应用程序需要创建消费者对象&#xff0c;订阅主题并开始接…

微软发布Azure Functions、Service Fabric和IoT Starter Kits新服务

微软此次 Build 2016 大会的重点主题一直都围绕开发和 Microsoft Azure 云服务&#xff0c;今天更是对外发布了 Azure Functions、Service Fabric 和 IoT Starter Kit 等一系列新服务。就目前与其它友商的竞争而言&#xff0c;微软近期不断的修炼内功&#xff0c;使 Microsoft …

python发送邮件 退回_python 发送邮件(收到的邮件要有发送方才能回复)

Python使用SMTP(简单邮件传输协议)发送邮件普通文本邮件普通文本邮件发送的实现&#xff0c;关键是要将MIMEText中_subtype设置为plain## -*- coding: UTF-8 -*-import smtplibfrom email.mime.text import MIMEText#导入MIMEText类from email import encodersfrom email.heade…

JAVA面试常考系列六

转载自 JAVA面试常考系列六 题目一一个Applet有哪些生命周期&#xff1f; 一个Applet的生命周期分为以下四个阶段&#xff1a; Init 每次加载时都会初始化一个小程序。此方法通知Applet&#xff0c;方法已经被装入系统&#xff0c;在第一次调用start方法之前总是先调用它。Init…

.NET的未来包含一个开源的Mono

在微软Build 2016大会的第二天&#xff0c;微软项目经理Scott Hunter和Scott Hanselman就.NET平台的现状和未来计划做了一场演讲。演讲的题目是“.NET概述”&#xff0c;他们的精彩演讲耗时一个小时&#xff0c;描绘了公司对于.NET的目标以及开发人员可以期待什么。就像开幕式主…

kafka消费者接收分区测试

【README】 本文演示了当有新消费者加入组后&#xff0c;其他消费者接收分区情况&#xff1b;本文还模拟了 broker 宕机的情况&#xff1b;本文使用的是最新的 kafka3.0.0 &#xff1b;本文测试案例&#xff0c;来源于 消费者接收分区的5种模型&#xff0c;建议先看模型&#…