本次示例,我们单独创建一个 AutoMapperService 的项目,用于放置映射配置文件,映射注册方法,映射公共方法。

1.映射配置文件

用于配置源实体到目标实体的映射

public class AccountProfile : AutoMapper.Profile
{
public AccountProfile()
{
//配置源实体AccountEntity到目标实体AccountViewModel的映射
CreateMap<AccountEntity, AccountViewModel>();
}
}

在项目中根据实际需求,按照业务创建不同的配置文件,比如用户配置文件UserProfile,配置用户相关实体的映射;订单配置文件OrderProfile配置订单业务相关实体的映射。

2.映射注册方法

public class MappingConfig
{
//public static void Init()
//{
// AutoMapper.Mapper.Initialize(cfg => {
// cfg.AddProfile<Profiles.AccountProfile>();
// });
//} private static readonly Type BaseType = typeof(AutoMapper.Profile);
public static void RegisterMaps()
{
//加载 AutoMapperService的程序集
var assembly = System.Reflection.Assembly.Load("AutoMapperService");
//筛选出继承AutoMapper.Profile的映射配置文件,所有映射配置文件都必须继承AutoMapper.Profile
var types = assembly.GetTypes().Where(t => t.BaseType.Equals(BaseType));
//初始化映射配置文件
AutoMapper.Mapper.Initialize(cfg => {
cfg.AddProfiles(types);
});
}
}

本示例采用加载程序集统一注册方法,项目后期需要添加新的映射配置文件,直接添加即可

3.映射公共方法

3.1方法介绍

该方法包含常用的实体映射,List映射,IEnumerable映射等

public static class AutoMapperHelper
{
/// <summary>
/// 集合对集合
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="self"></param>
/// <returns></returns>
public static IEnumerable<TResult> MapTo<TResult>(this System.Collections.IEnumerable self)
{
if (self == null) throw new ArgumentNullException();
return (IEnumerable<TResult>)Mapper.Map(self, self.GetType(), typeof(IEnumerable<TResult>));
} /// <summary>
/// 集合对集合
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="self"></param>
/// <returns></returns>
public static List<TResult> MapTo<TSource, TResult>(this List<TSource> self)
{
if (self == null) throw new ArgumentNullException();
return Mapper.Map<List<TSource>, List<TResult>>(self);
}
/// <summary>
/// 对象对对象
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="self"></param>
/// <returns></returns>
public static TResult MapTo<TResult>(this object self)
{
if (self == null) throw new ArgumentNullException();
return (TResult)Mapper.Map(self, self.GetType(), typeof(TResult));
}
}

3.2项目中如何使用

//添加AutoMapperService引用
using AutoMapperService;
public class AccountLogic
{
private readonly AccountService _accountSer;
public AccountLogic(AccountService accountSer)
{
this._accountSer = accountSer;
}
public AccountViewModel GetAccountById(int id)
{
//目标实体
AccountViewModel res = null;
//源实体
AccountEntity sourceEntity = _accountSer.GetAccount(id);
//调用MapTo方法向目标实体映射
//AccountEntity到AccountViewModel的映射,已在AccountProfile文件中配置
if (entity != null)
{
res = sourceEntity.MapTo<AccountViewModel>();
}
return res;
}
}

4.Web项目如何调用AutoMapper注册方法

本次示例,是在.Net Framework4.6.1框架下MVC模式开发,在web层中Global.asax文件下,在Application_Start方法调用AutoMapper注册方法即可

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(System.Web.Http.GlobalConfiguration.Configuration);
Filters.FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
//调用AutoMapper注册方法
MappingConfig.RegisterMaps();
}
}

4.单元测试项目如何调用AutoMapper注册方法

在单元测试项目添加TestStart文件,如下内容,单元测试每次启动之前会自动调用Start方法,对AutoMapper的配置文件进行注册。若没有注册,在单元测试中调用3.2中的GetAccountById方法时,对象映射会失败。

/// <summary>
/// 单元测试启动之前初始化
/// </summary>
[TestClass]
public class TestStart
{
/// <summary>
/// 初始化逻辑方法
/// </summary>
[AssemblyInitialize]
public static void Start(TestContext context = null)
{
//调用AutoMapper的注册
AutoMapperService.MappingConfig.RegisterMaps();
}
}

AutoMapper项目实践的更多相关文章

  1. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

  2. Windows on Device 项目实践 3 - 火焰报警器制作

    在前两篇<Windows on Device 项目实践 1 - PWM调光灯制作>和<Windows on Device 项目实践 2 - 感光灯制作>中,我们学习了如何利用I ...

  3. Windows on Device 项目实践 2 - 感光灯制作

    在上一篇<Windows on Device 项目实践 1 - PWM调光灯制作>中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成一个 ...

  4. Windows on Device 项目实践 1 - PWM调光灯制作

    在前一篇文章<Wintel物联网平台-Windows IoT新手入门指南>中,我们讲解了Windows on Device硬件准备和软件开发环境的搭建,以及Hello Blinky项目的演 ...

  5. Hangfire项目实践

    Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget ...

  6. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  7. MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  8. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

随机推荐

  1. Android-Kotlin-配置/入门

    1.配置Kotlin开发插件,点击File菜单,选择Settings,选择Plugins,会显示扩展的插件; 2.然后选择Browse repositories...,搜索栏目中搜索Kotlin即可, ...

  2. CVPR2013总结

    前不久CVPR的结果出来了,首先恭喜我一个已经毕业工作的师弟中了一篇文章.完整的文章列表已经在CVPR的主页上公布了(链接),今天把其中一些感兴趣的整理一下,虽然论文下载的链接大部分还都没出来,不过可 ...

  3. C#调用haskell遭遇Attempted to read or write protected memory

    1. Haskell的代码如下: 上面的代码中readMarkdown与writeHtmlString是pandoc中的函数,newString的作用是将String转换为IO CString. 2. ...

  4. JS中同步显示并分割输入的数字字符串

    题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图 ...

  5. 读取excel合并单元格内容

    def get_excel_content(excel_path): contents = [] if self.log_path.endswith('xls'): workbook = xlrd.o ...

  6. typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 集成 koa

    接上文 1.安装 koa yarn add koa koa-router koa-static yarn add @types/koa @types/koa-router @types/koa-sta ...

  7. [Leetcode]303.区域和检索&&304.二维区域和检索

    题目 1.区域和检索: 简单题,前缀和方法 乍一看就觉得应该用前缀和来做,一个数组多次查询. 实现方法: 新建一个private数组prefix_sum[i],用来存储nums前i个数组的和, 需要找 ...

  8. [Leetcode]931.下降路径最小和

    题目链接 这一题目首先需要弄懂题目的意思,下降路径最小和指的是在方阵中可以从上往下行走,走过后获得的值最小,方向可以是走左下,右下,直下. 题目和传统的动态规划一样,把边界的值先初始化,然后通过状态转 ...

  9. Docker端口映射(六)

    一.容器端口映射 1.1. 外部访问容器 在启动容器时候,如果不指定参数,在容器外部是无法通过网络来访问容器内的服务的 当容器运行一些网络服务的时候,我们可以通过指定-p或者-P参数来实现能够让外部访 ...

  10. 09-02 java 多态

    多态的前提.多态的特点 /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态. 举例: 猫是猫,猫是动物. 水(液体,固体,气态). 多态的前提: A:要有继承关系. B:要有方法重写. 其实 ...