网上使用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. JavaWeb项目里面的路径获取方法总结

    仅为资源搬运,个人还未充分理解... request.getRealPath不推荐使用request.getRealPath("") 这个方法已经不推荐使用了 request.ge ...

  2. HDU3605 Escape —— 二分图多重匹配

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    ...

  3. Js中获取显示器、浏览器以及窗口等的宽度与高度的方法

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  4. Python: PS滤镜--径向模糊

    本文用 Python 实现 PS 滤镜中的径向模糊特效,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/3 ...

  5. vim的tab缩进及用空格设置

    编辑~/.vimrc文件,分别设置用空格而不是用tab,一个tab多少个空格,自动缩进多少宽度,显示行号. set expandtabset tabstop=4 set shiftwidth=4 se ...

  6. darknet源码学习

    darknet是一个较为轻型的完全基于C与CUDA的开源深度学习框架,其主要特点就是容易安装,没有任何依赖项(OpenCV都可以不用),移植性非常好,支持CPU与GPU两种计算方式.1.test源码( ...

  7. JUC类图

    JUC的类图总览.

  8. ubuntu下网络性能测试

    iperf的主要功能 TCP 测量网络带宽 报告MSS/MTU值的大小和观测值 支持TCP窗口值通过套接字缓冲 当P线程或Win32线程可用时,支持多线程.客户端与服务端支持同时多重连接 UDP 客户 ...

  9. Code-NFine:NFine权限控制

    ylbtech-Code-NFine:NFine权限控制 1.返回顶部 1. NFine框架研究 1.前台业务操作 1.1 系统菜单配置方法 1.2 菜单管理配置方法 1.2.1 按钮管理 1.2.2 ...

  10. 设计模式学习笔记 1.factory 模式

    Factory 模式 用户不关心工厂的具体类型,只知道这是一个工厂就行. 通过工厂的实现推迟到子类里面去来确定工厂的具体类型. 工厂的具体类型来确定生产的具体产品. 同时用户不关心这是一个什么样子的产 ...