ABP之应用服务

Posted 善良的小赵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABP之应用服务相关的知识,希望对你有一定的参考价值。

在上一篇的笔记中,已经大致对Application层的使用作了简要的使用说明,感觉还是有些东西需要研究一下,所以承接上文,对AutoMapper这个方便的东西,稍微研究一下。

一.初识AutoMapper

首先使用一个简单的控制台应用程序,测试一下AutoMapper。我们使用nuget将AutoMapper的库引入到我们的项目中就可以使用了。

运行一下

上面的代码实现了从List<Book>到List<BookDto>的映射。

从上面的标注中可以看出使用AutoMapper 的关键点:

1. 创建映射规则,上面我创建了从Book到BookDto的单向映射

2. 使用映射

问题来了,上面的代码只是实现了最简单的映射关系,就是相同名字的Model和Dto之间的映射,此时的Msg是没有值的,如果我想将Book中的BookName的值赋值给Msg,怎么办呢,那么这里就需要定制我们自己的映射规则了。只要将代码稍微修改一下就好了

从上面的代码中可以看出我们使用的都是Mapper的静态方法,虽然很方便,但是依赖性比较强,那么有没有使用实例方法的方式呢?

二.ABP中的AutoMapper 

(1) 在ABP中集成了AutoMapper,封装了AutoMapper中的方法,都是进行了相应的扩展,比如MapTo。在ABP中定义映射规则的方式总体来说两种。

     1.使用特性标签AutoMap、AutoMapTo、AutoMapFrom,这种方式的缺点就是不方便自定义规则,只能使用默认的规则

在这里稍微插一句,如果Dto的字段与Model中的字段完全对应,命名完全相同,没有多余的字段,其实不打特性标签,也是可以直接调用映射API实现映射的,但是还是强烈建议一定要定义映射规则的,因为你的Dto并不是一直都是完全对应的。

      2.使用API的方式定义映射规则。

    (1)在ABP Zero中对映射规则进行统一的管理,减少耦合性

 

    (2)在Abp免费的模板框架中可以使用Profile的方式,实现自定义规则的创建。

      在模板中为我们创建的User中找到了这个profile

 

 

所以我们按照User中给出的代码,我们可以将特性标签去掉了,编写我们自己的MapFile,比如这样:

运行也是OK的

(2)映射API的调用

在ABP中,我们即可以使用AutoMapper原生的API实现模型和Dto之间的映射,也可以使用Abp.AutoMapper中为我们封装的API,同时还可以使用ObjectMapper.

 

在原生的AutoMapper中有一种方式是使用实例化一个Map对象的方式,创建映射规则。ObjectMapper就是通过依赖注入的方式注入的一个用来创建映射规则的Mapp实例对象,这个属性是在ApplicationService的顶级父类AbpServiceBase中定义的。

使用ObjectMapper的好处,也是显而易见的,可以减少对AutoMapper的耦合性,方便我们进行单元测试。

以上是关于ABP之应用服务的主要内容,如果未能解决你的问题,请参考以下文章

企业级工作流解决方案--微服务消息处理模型之与Abp集成

ABP中的拦截器之ValidationInterceptor(下)

.NetCore2.0项目之ABP+Vue(IView框架)单页应用之路,启动

ABP框架系列学习模块系统之示例开发

ABP架构学习系列

ABP之框架体系