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);
        }
    }
}

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

最后源代码:

AutoMapperSample.zip

时间: 2024-10-18 14:53:04

AutoMapper 使用实践的相关文章

AutoMapper 最佳实践

AutoMapper 是一个基于命名约定的对象->对象映射工具. 只要2个对象的属性具有相同名字(或者符合它规定的命名约定),AutoMapper就可以替我们自动在2个对象间进行属性值的映射.如果有不符合约定的属性,或者需要自定义映射行为,就需要我们事先告诉AutoMapper,所以在使用 Map(src,dest)进行映射之前,必须使用 CreateMap() 进行配置. Mapper.CreateMap<Product, ProductDto>(); // 配置 Product en

AutoMapper

AutoMapper 使用实践 一.   使用意图 常常在开发过程中,碰到一个实体上的属性值,要赋值给另外一个相类似实体属性时,且属性有很多的情况.一般不利用工具的话,就要实例化被赋值实体B,然后再将实体A的字段一个个赋值给B的属性,单单写这些没有技术含量的赋值语句,就要用很大的代码篇幅.假如做得好一点的话,一般就是利用反射的方式,将A属性赋值给B,当然用反射的话,要顺利将A的属性,赋值B的属性,这样确实能够减少代码篇幅,那就要有一些约束或者限制,例如属性名称要相同,属性的数据类型要相同,这样反

AutoMapper实际项目运用

AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前,我们需要先进行映射规则的配置. public class Source { public int SomeValue { get; set; } public string AnotherValue { get; set; } } public class Destination { public

.NET Core中使用AutoMapper

何为AutoMapper AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 安装AutoMapper 这里我们在NuGet中下载安装AutoMapper.如下图 在项目中执行此命令 安装完成后 即可查看到依赖项中的 NuGet 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前,我们需要先进行映射规则的配置. public class ClubDetail { public int Id { ge

我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践

写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯新湖,鱼跃翠堤:第一次念你,燕飞巢冷,释怀记忆:第一次梦你,云翔海岛,轮渡迤逦:第一次认你,怨江别续,草桥知己:第一次怕你,命悬一线,遗憾禁忌:第一次悟你,千年菩提,生死一起. 人生有很多的第一次:小时候第一次牙牙学语.第一次学蹒跚学步...长大后第一次上课.第一次逃课.第一次骑自行车.第一次懂事.第一次和喜

实体类型的转换? Automapper OR 自定义

在引入了entity framework 之后,系统有了一种新的需求,即对Viewmodel 和model之间的相互转换. 这之间有各种境界.今天拿出来品味一下. 1 用automapper 方法很简单.①添加对automapper的引用 ② 在引用的时候,创建两个实体之间的映射关系.我们要做的只是将要映射的两个类型告诉AutoMapper(调用Mapper类的Static方法CreateMap并传入要映射的类型): <span style="font-family:KaiTi_GB231

[转]ASP.NET MVC 4 最佳实践宝典

原文:http://www.cnblogs.com/sonykings/archive/2013/05/30/3107531.html ASP.NET MVC最佳实践 本文档提供了一套旨在帮助创建最佳优化ASP.NET MVC应用程序的 开发人员编码准则. 当然,由您来选择这些优化准则. 模型的建议 Model是定义业务领域相关的对象,应该包含业务逻辑(对象如何动作和关联),验证逻辑(验证对象的有效值),数据逻辑(数据对象如何持久化),和会话逻辑(跟踪用户状态). 创建独立的Model项目,在A

中小型研发团队架构实践三要点--转

来自微信公众号聊聊架构 作者|张辉清 编辑|雨多田光 如果你正好处在中小型研发团队…… 中小型研发团队很多,而社区在中小型研发团队架构实践方面的探讨却很少.中小型研发团队特别是 50 至 200 人的研发团队,在早期的业务探索阶段,更多关注业务逻辑,快速迭代以验证商业模式,很少去关注技术架构. 这时如果继续按照原有的架构及研发模式,会出现大量的问题,再也无法玩下去了.能不能有一套可直接落地.基于开源.成本低,可快速搭建的中间件及架构升级方案呢? 我是一个有十多年经验的 IT 老兵,曾主导了两家公

中小研发团队架构实践之系列大纲

以下是中小研发团队架构实践系列的大纲,部分已链接,未链接部分我也会持续的更新和发布,期待你的支持与互动. 第一篇 开篇--照着做,你也能成为架构师 第1章 中小研发团队架构实践,附案例和代码 一.框架篇--工欲善其事,必先利其器 二.架构篇--思想提升 三.公共应用篇--业务与技术的结合 四.进阶篇--从架构到管理 五.案例参考和Demo下载 第二篇 架构篇--思想提升第2章 企业总体架构规划 一.企业商务模型 二.架构现状 2.1 功能架构 2.2 应用架构 2.3 数据设计 2.4 物理架构