为了说明AutoMapper如何使用,我专门开设了一个专题来讲,如果您还没有查看该专题,请点击这里。既然系统地学习了AutoMapper,那么接下来就是该用它实战的时候了。今天,我们就来揭开AutoMapper如何在ABP框架中使用的面纱。

因为这里演示的是用ABP框架搭建的项目,本博客的讲解的前提是假设你有了ABP基础,所以,如果您还不了解ABP框架,请查看我的ABP框架的系列博客,请点击这里

下面正式开始今天的讲解。

首先,让我们稍微回忆一下AutoMapper的知识点。

问:什么是AutoMapper?

答:AutoMapper翻译过来就是“自动映射工具”。它的作用就是将一个源类型映射成一个目标类型,比如Person——>PersonDto,User——>UserDto。

问:什么情况下使用AutoMapper?

答:一般在项目的开发中,经常需要将Entity实体映射成ModelDto或者ViewModel,这个时候,使用AutoMapper仅需要简单的配置,就可以实现这些需求,非常方便。

接下来,讲一下项目中的具体配置。

在我的ABP项目中,首先核心层有一个实体类TerminalDevices,类定义如下:

  1 namespace Noah.ChargeStation.Core.Entities
2 {
3 //终端表
4 public class TerminalDevices : Entity
5 {
6
7 /// <summary>
8 /// 终端编码
9 /// </summary>
10 public virtual string Code
11 {
12 get;
13 set;
14 }
15 /// <summary>
16 /// IMEI
17 /// </summary>
18 public virtual string IMEI
19 {
20 get;
21 set;
22 }
23 /// <summary>
24 /// SIMCardNO
25 /// </summary>
26 public virtual string SIMCardNO
27 {
28 get;
29 set;
30 }
31 /// <summary>
32 /// InstallDate
33 /// </summary>
34 public virtual DateTime? InstallDate
35 {
36 get;
37 set;
38 }
39 /// <summary>
40 /// PlacePosition
41 /// </summary>
42 public virtual string PlacePosition
43 {
44 get;
45 set;
46 }
47 /// <summary>
48 /// Version
49 /// </summary>
50 public virtual int? Version
51 {
52 get;
53 set;
54 }
55 /// <summary>
56 /// TotalCoins
57 /// </summary>
58 public virtual int TotalCoins
59 {
60 get;
61 set;
62 }
63 /// <summary>
64 /// CurrentBoxCoins
65 /// </summary>
66 public virtual int CurrentBoxCoins
67 {
68 get;
69 set;
70 }
71 /// <summary>
72 /// 最小计费单位
73 /// </summary>
74 public virtual int MinimumUnit
75 {
76 get;
77 set;
78 }
79 /// <summary>
80 /// 充电时长
81 /// </summary>
82 public virtual int ChargeTime
83 {
84 get;
85 set;
86 }
87 /// <summary>
88 /// MoneyBoxCapacity
89 /// </summary>
90 public virtual int? MoneyBoxCapacity
91 {
92 get;
93 set;
94 }
95 /// <summary>
96 /// 终端名称
97 /// </summary>
98 public virtual string Name
99 {
100 get;
101 set;
102 }
103 /// <summary>
104 /// 终端类型:0--同城类终端 1--跨城类终端
105 /// </summary>
106 public virtual int? Type
107 {
108 get;
109 set;
110 }
111 /// <summary>
112 /// 所属城市
113 /// </summary>
114 public virtual int? CityID
115 {
116 get;
117 set;
118 }
119 /// <summary>
120 /// 所属运营商
121 /// </summary>
122 public virtual int? OperatorID
123 {
124 get;
125 set;
126 }
127 /// <summary>
128 /// 所属站台
129 /// </summary>
130 public virtual int? StationID
131 {
132 get;
133 set;
134 }
135 /// <summary>
136 /// 经度
137 /// </summary>
138 public virtual decimal? Longitude
139 {
140 get;
141 set;
142 }
143 /// <summary>
144 /// 纬度
145 /// </summary>
146 public virtual decimal? Latitude
147 {
148 get;
149 set;
150 }
151 /// <summary>
152 /// 支付宝二维码内容
153 /// </summary>
154 public virtual string AlipayEWMContent
155 {
156 get;
157 set;
158 }
159 /// <summary>
160 /// 支付宝二维码图片
161 /// </summary>
162 public virtual string AlipayEWMImage
163 {
164 get;
165 set;
166 }
167 /// <summary>
168 /// 微信二维码内容
169 /// </summary>
170 public virtual string WechatEWMContent
171 {
172 get;
173 set;
174 }
175 /// <summary>
176 /// 微信二维码图片
177 /// </summary>
178 public virtual string WechatEWMImage
179 {
180 get;
181 set;
182 }
183 /// <summary>
184 /// 正在充电数量
185 /// </summary>
186 public virtual int? ChargingNum
187 {
188 get;
189 set;
190 }
191 /// <summary>
192 /// 上次通讯时间
193 /// </summary>
194 public virtual DateTime? LastConnectTime
195 {
196 get;
197 set;
198 }
199 /// <summary>
200 /// 0--失联 1--正常 2--维修 3--维护4--下线
201 /// </summary>
202 public virtual int? Status
203 {
204 get;
205 set;
206 }
207 /// <summary>
208 /// SystemCode
209 /// </summary>
210 public virtual string SystemCode
211 {
212 get;
213 set;
214 }
215 /// <summary>
216 /// Certificate
217 /// </summary>
218 public virtual string Certificate
219 {
220 get;
221 set;
222 }
223 /// <summary>
224 /// 到期时间
225 /// </summary>
226 public virtual DateTime? DueDate
227 {
228 get;
229 set;
230 }
231 /// <summary>
232 /// 创建人
233 /// </summary>
234 public virtual string CreatedBy
235 {
236 get;
237 set;
238 }
239 /// <summary>
240 /// 创建日期
241 /// </summary>
242 public virtual DateTime? CreatedDate
243 {
244 get;
245 set;
246 }
247 /// <summary>
248 /// 最后更新人
249 /// </summary>
250 public virtual string UpdatedBy
251 {
252 get;
253 set;
254 }
255 /// <summary>
256 /// 最后更新日期
257 /// </summary>
258 public virtual DateTime? UpdatedDate
259 {
260 get;
261 set;
262 }
263 public TerminalDevices()
264 {
265
266 }
267
268 }
269
270 }

可以看到,仅一个实体类,就要将近300行的代码,但是在服务层或者展现层使用的时候,有些属性是不需要的,所以这时我们就要定义我们的Dto类了。

随后,我在ABP项目中的服务层定义了一个对应的TerminalDeviceDto类,定义如下:

 1 namespace Noah.ChargeStation.Application.TerminalDevicesApp.Dto
2 {
3 public class TerminalDeviceDto:IDto
4 {
5 [DisplayName("设备编码")]
6 public string Code { get; set; }
7 public string IMEI { get; set; }
8 [DisplayName("SIM卡号")]
9 public string SIMCardNO { get; set; }
10 public string InstallDate { get; set; }
11 public string PlacePosition { get; set; }
12 public int Version { get; set; }
13 [DisplayName("总投币")]
14 public int TotalCoins { get; set; }
15 public int CurrentBoxCoins { get; set; }
16 public int MinimumUnit { get; set; }
17 public int ChargeTime { get; set; }
18 public int MoneyBoxCapacity { get; set; }
19 public string Name { get; set; }
20 public int Type { get; set; }
21 public int CityId { get; set; }
22 public int OperatorId { get; set; }
23 public int StationId { get; set; }
24 public decimal Longitude { get; set; }
25 public decimal Latitude { get; set; }
26 public string AlipayEWMContent { get; set; }
27 public string AlipayEWMImage { get; set; }
28 public string WechatEWMContent { get; set; }
29 public string WechatEWMImage { get; set; }
30 public int ChargingNum { get; set; }
31 public DateTime LastConnectTime { get; set; }
32 public int Status { get; set; }
33 public string SystemCode { get; set; }
34 public string Certificate { get; set; }
35 public DateTime DueDate { get; set; }
36 public string CreatedBy { get; set; }
37 public DateTime CreatedDate { get; set; }
38 public string UpdatedBy { get; set; }
39 public DateTime UpdatedDate { get; set; }
40
41 }
42 }

当然,这里的Dto类定义的属性跟你的具体业务相关,定义的属性还可能更少。

上面讲的是源类型和目标类型的定义,下面开始讲它们之间的映射配置。

首先,我在应用服务层新建一个文件夹取名“AutoMapper”,里面放跟AutoMapper配置相关的东西。

如图,新建一个类TerminalDeviceProfile(CityProfile类是我的另一个实体类对应的AutoMapper配置文件),定义如下:

namespace Noah.ChargeStation.Application.AutoMapper
{
public class CityProfile:Profile
{
protected override void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Cities, CityDto>();
});
}
}
}

如果您对这么配置不清楚原因,请查看我的AutoMapper系列教程,点击查看

再创建一个AutoMapperWebConfig静态类,定义如下:

namespace Noah.ChargeStation.Application.AutoMapper
{
public static class AutoMapperWebConfig
{
public static void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile<CityProfile>();
cfg.AddProfile<TerminalDeviceProfile>();
});
Mapper.AssertConfigurationIsValid();//验证所有的映射配置是否都正常
}
}
}

接下来,在应用服务层的模块类中调用该静态类的静态方法,加载所有的AutoMapper配置信息。

namespace Noah.ChargeStation.Application
{
[DependsOn(typeof(ChargeStationCoreModule), typeof(AbpAutoMapperModule))]
public class ChargeStationApplicationModule : AbpModule
{
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
AutoMapperWebConfig.Configure();//一次性加载所有映射配置
}
}
}

这里需要注意的是,AutoMapper的配置一般放在项目启动的时候进行加载且只加载一次就够了,而在ABP框架搭建的项目中,除了展现层(Web和WebAPI层),其他层都会有一个Module类(类名以Module结尾)。这些类都重写了父类AbpModule的Initialize方法,旨在模块初始化的时候调用,这样,映射的配置也在模块初始化的时候完成了。如果在一般的ASP.Net项目中,应该在全局配置文件Global.asax中的Application_Start方法中调用AutoMapper的配置方法,其他项目类似。

以后,想要添加配置信息时,只需要定义相应的XXProfile类,然后在AutoMapperWebConfig类中添加配置文件类就可以了。

AutoMapper在ABP框架中的使用说明的更多相关文章

  1. AutoMapper在ABP框架

    AutoMapper在ABP框架中的使用说明 为了说明AutoMapper如何使用,我专门开设了一个专题来讲,如果您还没有查看该专题,请点击这里.既然系统地学习了AutoMapper,那么接下来就是该 ...

  2. ABP框架中一对多,多对多关系的处理以及功能界面的处理(1)

    在我们开发业务的时候,一般数据库表都有相关的关系,除了单独表外,一般还包括一对多.多对多等常见的关系,在实际开发过程中,需要结合系统框架做对应的处理,本篇随笔介绍基于ABP框架对EF实体.DTO关系的 ...

  3. AutoMapper之ABP项目中的使用介绍

    最近在研究ABP项目,昨天写了Castle Windsor常用介绍以及其在ABP项目的应用介绍 欢迎各位拍砖,有关ABP的介绍请看阳光铭睿 博客 AutoMapper只要用来数据转换,在园里已经有很多 ...

  4. 解析ABP框架中的事务处理和工作单元,ABP事务处理

    通用连接和事务管理方法连接和事务管理是使用数据库的应用程序最重要的概念之一.当你开启一个数据库连接,什么时候开始事务,如何释放连接...诸如此类的. 正如大家都知道的,.Net使用连接池(connec ...

  5. 在Abp框架中使用Mysql数据库的方法以及相关问题小记

    最近发现了一款DDD的框架 看起来不错,据说挺流弊的 刚好最近要弄点小东西,拿来试试也不错 苦于穷逼买不起高配服务器,只好装mysql数据库了 下面说下如何在该框架下使用Mysql数据库 打开项目后, ...

  6. 在ABP框架中使用MapTo容易犯的错误

    用自己的话说:MapTo其实就是两个实体间的数据转换.不用像以前那样p.name=p1.name 这样赋值,一旦实体的属性多到十几个以上的时候,这样赋值代码就显得有些臃肿了,如下面: Resource ...

  7. ABP框架中微服务跨域调用其它服务接口

    AjaxResponse为ABP自动包装的JSON格式 /// <summary> /// 通过地址和参数取得返回OutPut数据 /// </summary> /// < ...

  8. ABP项目中的使用AutoMapper

    AutoMapper之ABP项目中的使用 最近在研究ABP项目,昨天写了Castle Windsor常用介绍以及其在ABP项目的应用介绍 欢迎各位拍砖,有关ABP的介绍请看阳光铭睿 博客 AutoMa ...

  9. ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理

    ABP框架的数据访问底层是基于EFCore(Entity Framework Core)的,是微软标志性且成熟的ORM,因此它本身是支持多种主流数据库MySQL,SqlServer,Oracle,SQ ...

随机推荐

  1. 3.openssl speed和openssl rand

    (1).openssl speed 测试加密算法的性能. 支持的算法有: openssl speed [md2] [mdc2] [md5] [hmac] [sha1] [rmd160] [idea-c ...

  2. HTML、CSS和JS

    一.html 1.web流程中的HTML HTML---->赤裸裸的人 CSS  ---->穿华丽的衣服 JS    ---->让人动起来 浏览器和server端之间的通信本质上是字 ...

  3. 利用should.js进行测试

    nodejs 环境 , 安装should.js包 (npm install should) var should = require('should'); //正确1, 错误0 100 precent ...

  4. 8.4 H5知识点总结

    HTML简介 HyperText Markup Language 简称为HTML HyperText: 超文本 (文本 + 图片 + 视频 + 音频 + 链接) Markup Language: 标记 ...

  5. c#中获取数组的行列个数的方法

    GetUpperBound可以获取数组的最高下标.GetLowerBound可以获取数组的最低下标.这样就可以实现对数组的遍历//定义二维数组string[,] myStrArr2=new strin ...

  6. 转 对菜鸟开发者的叮咛:花一万个小时练习Coding,不要浪费一万小时无谓地Debugging

    原文见http://blog.jobbole.com/74825/ Coding 之于科技的重要性不言可喻,也不再是软体工程师的专利,医师.律师.会计师.护理师.金融从业人员,甚至是听起来摸不着边的政 ...

  7. ibatis XML标签的含义

    selectKey: 有3个主要的属性:     1)resultClass:返回的主键的数据类型,跟sqlMap中的数据类型一致:     2)type:表示主键在insert之前或之后生成(取决于 ...

  8. Fedora20安装fcitx输入法

    Fedora20安装fcitx输入法 Fedora20默认安装的是ibus输入法,总有一些原因让我们选择fcitx输入法: ibus出词顺序有bug 在输入人名的时候,有些名字输入两三次后还是不会出现 ...

  9. 普林斯顿结构 VS 哈佛结构

    1. 冯·诺依曼结构 冯·诺依曼结构,又称为普林斯顿体系结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构.取指令和取操作数都在同一总线上,通过分时复用的方式进行:缺点是在高速运行时,不能 ...

  10. 小甲鱼python视频第十讲(课后习题)

    1.list1[0]与list1[0:1]的区别 2.分片的步长 3关于列表的copy(注意list2与list3的区别) list1 = [,,,,,,] list2 = list1[:] list ...