网上使用AutoMapper的文章很多,就不多说了。这里主要记录一下怎么在项目中配置和使用。

首先是从NuGet获取AutoMapper。

在Startup.cs文件中注册AutoMapper服务

public void ConfigureServices(IServiceCollection services)
{
services.AddAutoMapper();
}

一般把AutoMapper的映射关系单独写在一个Profile文件,比如个人习惯在Service层添加一个ServiceProfile.cs文件(这是因为所有的实体和Dto都是在Service层定义的),可能的样子如下:

public class ServiceProfiles : Profile
{
public ServiceProfiles()
{
CreateMap<WxAccount, WxAccountSessionDto>();
CreateMap<WxNews, WxNewsListDto>();
CreateMap<WxMessage, WxMessageListDto>()
.ForMember(w => w.MatchType, opts =>
{
opts.ResolveUsing<WxMessageListDtoResolver>();
});
}
}

这个文件也没什么好说的,必须继承自AutoMapper.Profile,在构造函数中创建映射关系,具体使用可看看其他大神的文章,这里就不班门弄斧了。

接下来就是最后一步,在项目中使用定义的ServiceProfile,AutoMapper提供了一个Initialize方法,具体用法如下:

Mapper.Initialize(cfg =>
{
cfg.AddProfile<ServiceProfiles>();
});

这里要注意这句代码的位置,要写在Startup.cs的构造函数内

public Startup(IConfiguration configuration)
{
Configuration = configuration; LoggerRepository = LogManager.CreateRepository("NETCoreRepository");
XmlConfigurator.Configure(LoggerRepository, new FileInfo(Environment.CurrentDirectory + "\\Config\\log4net.config")); Mapper.Initialize(cfg =>
{
cfg.AddProfile<ServiceProfiles>();
});
Mapper.AssertConfigurationIsValid();
}

之前就是因为把初始化代码写在ConfigureServices方法内导致配置项不起作用,特此标记。

上面的理解有误,请参考下面的说明:

一般来讲,在ConfigureServices中注册AutoMapper服务只要如下代码即可:

services.AddAutoMapper();

AutoMapper会从程序集中搜索Profile的子类,然后把这些子类加入到配置中。如果Profile文件是在当前程序中定义,那没有问题,但如果是写在外部类库内,则是搜索不到的,所以类似我的做法,把Profile定义在类库内,需要手动把配置文件加入到AutoMapper的配置中,如下:

services.AddAutoMapper(cfg =>
{
cfg.AddProfile(typeof(ServiceProfiles));
});

但是,如果仅仅这样,如同我上面的ServiceProfile是不能正确运行的,因为我定义了一个 WxMessageListDtoResolver 这样一个 IValueResolver 接口的实现,说到这里大家应该猜到,AutoMapper没法自动调用这个实现,需要我们添加注入,所以还要加入这样一句

services.AddSingleton<WxMessageListDtoResolver>();

这样程序就可以正常使用了。

但是,想象一下,如果我们的类库中如果定义了很多IValueResolver,是不是每个都要注册一次呢,想想都是噩梦,所以,这里还有一个办法,就是使用Mapper的Initialize方法,提前把Profile传递进去,再调用AddAutoMapper时,会自动将所有的Profile内用到的几个接口如IValueResolver,IMemberValueResolver的实现注入到程序,这样就可以了。所以,我之前的理解是错误的,并不需要把Initialize写到Startup的构造函数内,只要在AddAutoMapper之前就可以了。

所以,建议的写法,在ConfigureServices方法内:

 Mapper.Initialize(cfg =>
{
cfg.AddProfile<ServiceProfiles>();
}); services.AddAutoMapper();

结束,谢谢~

【aspnetcore】在asp.net core中配置使用AutoMapper的更多相关文章

  1. Asp.Net Core中配置使用Kindeditor富文本编辑器实现图片上传和截图上传及文件管理和上传(开源代码.net core3.0)

    KindEditor使用JavaScript编写,可以无缝的于Java..NET.PHP.ASP等程序接合. KindEditor非常适合在CMS.商城.论坛.博客.Wiki.电子邮件等互联网应用上使 ...

  2. 在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)

    我们的富文本编辑器不能没有图片上传尤其是截图上传,下面我来教大家怎么实现MarkDown富文本编辑器截图上传和图片上传. 1.配置编辑器到html页 <div id="test-edi ...

  3. ASP.NET Core中配置监听URLs的五种方式

    原文: 5 ways to set the URLs for an ASP.NET Core app 作者: Andrew Lock 译者: Lamond Lu 默认情况下,ASP. NET Core ...

  4. 一劳永逸:域名支持通配符,ASP.NET Core中配置CORS更轻松

    ASP.NET Core 内置了对 CORS 的支持,使用很简单,只需先在 Startup 的 ConfigureServices() 中添加 CORS 策略: public void Configu ...

  5. 一劳永逸:域名支持通配符,ASP.NET Core中配置CORS

    ASP.NET Core 内置了对 CORS 的支持,使用很简单,只需先在 Startup 的 ConfigureServices() 中添加 CORS 策略: public void Configu ...

  6. 在Asp.Net或.Net Core中配置使用MarkDown富文本编辑器有开源模板代码(代码是.net core3.0版本)

    研究如何使用Markdown你们可能要花好几天才能搞定,但是看我的文章或者下载了源码,你搞定一般在10分钟之内.我先给各位介绍下它: Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯 ...

  7. ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

  8. ASP.NET Core 中jwt授权认证的流程原理

    目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...

  9. ASP.NET Core中的数据保护

    在这篇文章中,我将介绍ASP.NET Core 数据保护系统:它是什么,为什么我们需要它,以及它如何工作. 为什么我们需要数据保护系统? 数据保护系统是ASP.NET Core使用的一组加密api.加 ...

随机推荐

  1. HDU3065 病毒侵袭持续中 —— AC自动机

    题目链接:https://vjudge.net/problem/HDU-3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  2. HDU1102 Constructing Roads —— 最小生成树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题解: 纯最小生成树,只是有些边已经确定了要加入生成树中,特殊处理一下这些边就可以了. krus ...

  3. BluetoothLE-Multi-Library

    github地址:https://github.com/qindachang/BluetoothLE-Multi-Library BluetoothLE-Multi-Library 一个能够连接多台蓝 ...

  4. 【linux】lsof命令和{Linux下文件删除、句柄与空间释放问题}

      导读: 一.用事实说话 二.关于LSOF命令的其它用法: 三.参考文档:   正文: lsof:Finding open files with lsof 作用:查看文件被哪些进程打开 一.用事实说 ...

  5. springmvc配置一:ajax请求防止返回中文乱码配置说明

    Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里. Spring使用AnnotationMethodHandlerAdapter的 ...

  6. 解决js 运算 精度缺失

    github地址: https://github.com/MikeMcl/big.js

  7. Deques and Randomized Queues

    1. 题目重述 完成三个程序,分别是双向队列,随机队列,和随机队列读取文本并输出k个数. 2. 分析 2.1 双向队列 题目的性能要求是,操作时间O(1),内存占用最大48n+192byte. 当使用 ...

  8. 1.5-1.6 oozie部署

    一.部署 可参考文档:http://archive.cloudera.com/cdh5/cdh/5/oozie-4.0.0-cdh5.3.6/DG_QuickStart.html 1.解压oozie ...

  9. Several ports (8005, 8080, 8009) required

    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...

  10. supervisor 启动 celery 及启动中的问题

    一.前言 本教程重点在于supervisor的配置过程,celery的安装配置请参考其他教程 二.安装supervisor 1.安装命令 pip install supervisor # superv ...