网上使用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();

结束,谢谢~

最新文章

  1. HDU 3642 Get The Treasury (线段树扫描线)
  2. Odoo 9 PDF不显示中文字体
  3. Notes for Linux Administration Handbook (1) : Booting and Shutting Down
  4. Java对数组的操作(二)——集合与数组的切换
  5. 数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题(续1之拼接字符串)
  6. Computer Vision Applied to Super Resolution
  7. zookeeper 各节点数据保证是弱一致性
  8. 一次young gc耗时过长优化过程
  9. 快速失败(fail-fast)和安全失败(fail-safe)的区别
  10. Linux时间子系统之四:Timer在用户和内核空间流程
  11. 第十六节:语法总结(3)(C#6.0和C#7.0新语法)
  12. Codeforces Round #129 (Div. 1)E. Little Elephant and Strings
  13. R语言绘制花瓣图flower plot
  14. vs web项目远程发布到IIS
  15. 每周开源项目分享-年轻人的第一个OAuth2.0 Server:hydra
  16. tarjan强连通分量模板(pascal)
  17. easyui datagrid 列拖动
  18. rtmp发送H264及aac的音视频
  19. bulkcopy实现批量插入与更新
  20. c#工具类之Bitmap缩放帮忙类

热门文章

  1. 数据结构之 字符串---字符串匹配(kmp算法)
  2. UVA10689 Yet another Number Sequence —— 斐波那契、矩阵快速幂
  3. (转)使用cygwin注意事项一
  4. nginx开发_ngx_http_script源码解析
  5. springMVC之HttpServletRequest的getParameterMap()
  6. [Codeforces 877E] Danil and a Part-time Job
  7. 如何应用AutoIt,把局域网中所有的机器名展示在一个combox中?
  8. bzoj 4711 小奇挖矿 ——“承诺”类树形dp
  9. MSSQL 调用 .net 代码
  10. sublime配置java环境