大话领域驱动设计——应用层

概述

0762422ec04fb7d439a2ec684225f415.png

应用层是基于领域的应⽤程序用例的实现,应⽤程序⽤例可以看作是⽤户界⾯上的⽤户交互。这一篇,我将详细讲解应用层组件及用法。

总览

7da5329b002773680445c82cd69565ba.png

应用层包含以下组件:

数据传输对象(DTO):数据传输对象是一个简单的对象,不包含任何业务逻辑,用于在应用程序和表示层之间数据传输,当我们使用动态WebApi机制时,DTO会作为HTTP API接口传入传出参数。

应用服务(Application Service):应用服务是一个实现应用程序用例的无状态服务。应用程序服务通常获取并返回DTO。在ABP框架中,我们可以将其配置为动态WebApi。

工作单元(UOW):工作单元是一个应该作为一个事务单元来完成的原子工作。UOW内部的所有操作都应该在成功时提交,或者在失败时回滚。

b431817329d55e6341c4f4f9605a7790.png

在ABP框架下,应用层包含以下两个项目:

Application.Contracts项目包含应用服务接口和这些接口所使用的DTO。

Application项目是实现在Contracts项目中定义的接口的基本应用层。

实现细节

1

数据传输对象

f68aecc90056885384beddae6775e5c1.gif

在ABP框架下所有数据传输对象均需实现 IEntityDto 接口,ABP提供了该接口的默认实现类 EntityDto 。

07b345c8b2a74cc675b8727955460e62.gif

EntityDto有泛型和非泛型两种方式,泛型方式即 EntityDto<TKey> 会默认包含该泛型类型的ID,通常和实体中的ID做对应。如果我们不需要传递ID作为参数,则可以使用无泛型的方式作为DTO基类。

3ba6c1bc7ccc9b4b887fe45e0ef8e609.gif

和实体定义相似,ABP为DTO同样定义了包含审计字段的EntityDto基类, CreationAuditedEntityDto 包含记录对象添加时间和添加人的信息, AuditedEntityDto 包含最后修改时间和修改人, FullAuditedEntityDto 包含增删改的所有记录。

2

应用服务

cb400227c1e639e0801c6edf82c1ec7e.gif

在ABP框架规范中,应用服务接口继承自 IApplicationService ,存放于 Application.Contracts 项目中;其实现类继承自 ApplicationService 存放于 Application 项目中。

b2d4d022a0540f114e2eddd5d522447b.gif

在 ApplicationService 基类中,ABP框架默认添加了一些属性对象用于服务方法中调用,这里介绍几个比较常用的属性用途:

CurrentTenant/CurrentUser:

当前租户/当前用户,在应用服务中可以使用它们获取当前调用者的租户信息和用户信息。

f7ec7e6f3d63db3e27c007cfc2e939fc.png

ObjectMapper:

用于配合AutoMapper实现对象映射。

e69458e709466b9334ab8190613fdcab.png

ServiceProvider:

在使用依赖注入时,除常规的构造方法注入、属性注入等方式外,也可以使用ApplicationService中注入的ServiceProvider对象来获取实例。

1aef1e9163401c6fcb2a7fcd8e290323.png

GuidGenerator:

ABP框架提供了一种有序GUID的生成方案,IGuidGenerator是这种方式的接口声明,而在ApplicationService中,ABP默认注入了GuidGenerator对象用于服务内使用。

883961ec23dd35ac332e1f6ff71a0b49.png

UnitOfWorkManager:

用于工作单元处理,其中Current属性代表当前的工作单元。

dd72a2b03d69fba1a04da715b9f44ebf.png

dd372acd22aecdac1d493d53e2eb92ad.gif

在ABP中,还提供了实现默认增删改查方法的类 CrudAppService ,其接口定义为 ICrudAppService 。如果我们的应用服务需要实现增删改查,可直接继承自此类,其中主要包含以下方法:

CreateAsync:

用于添加数据并返回添加后的结果。使用动态WebApi时,该方法会被封装成POST方式HTTP API接口。当实体使用Guid作为主键时,如果接口调用者传入主键,则使用此主键,否则会使用GuidGenerator生成有序主键,如无特殊需求建议使用后者。

78a2290062329a08d859126789bab83d.png

UpdateAsync:

用于修改数据并返回修改后的结果,其方法包含两个参数:id表示需要修改的数据的ID,input为需要修改的对象。使用动态WebApi时,该方法会被封装成PUT方式HTTP API接口。

eeeb060ff7c3353cde80e298902fb292.png

DeleteAsync:

依据ID删除数据。使用动态WebApi时,该方法会被封装成DELETE方式HTTP API接口。

f4420c1f81e0908aa532e310df01e01d.png

GetAsync:

依据ID获取单条数据。使用动态WebApi时,该方法会被封装成GET方式HTTP API接口。

f4b7016c5e8ccbad8c88d2b728692034.png

GetListAsync:

用于获取数据集合。使用动态WebApi时,该方法会被封装成GET方式HTTP API接口。通常情况,我们可以使用 

PagedAndSortedResultRequestDto

 作为参数类型,可自动实现排序和分页,如果我们不需要排序,也可以使用 

PagedResultRequestDto

 作为参数类型。如果我们希望添加数据过滤条件,可以重写CrudAppService中的 

CreateFilteredQueryAsync

 方法。

b4605cf4d20aac65dd721f629d96324b.png

9a28189bd49ce6d7b4f8602cc2db2e01.gif

ABP中,应用服务默认使用AppService结尾,生成动态WebApi时,会自动去掉此后缀。

3f9107134463d93f441ade10501a6cce.png

注意:ABP生成动态WebAPI是依据应用服务的实现类,而如果使用动态客户端代理,是依据应用服务的接口声明。所以需要保证应用服务接口和实现的参数命名严格一致,否则使用动态客户端代理时无法正确传递参数。

3

工作单元

c5ce0958f07687aabe45e825b66d940c.gif

工作单元是对应用程序中数据库连接和事务范围的抽象和控制。默认情况下,ABP每个应用服务方法都是一个工作单元,除基础的工作单元控制外,我们也可以通过在调用仓储增删改方法时将autoSave参数设置为True来强制提交数据。

a800cf4c5337f9cf4f22a12e9aca5a9d.gif

除此之外,我们可以通过特性 [UnitOfWork] 控制工作单元的启用和停用。

a397e474a90c9b824f65dfa5a7d5ec03.gif

在第2章中,我们提到了UnitOfWorkManager对象,在应用服务中,我们可以通过此对象获取当前工作单元或者创建新的工作单元。

4

对象映射关系

2f89f94791e5110c35463f2e5894efb4.gif

除了DDD中定义的各种组件外,我们在ABP vNext框架下编写应用服务时,还需要创建DTO和实体类之间的映射关系,作为AutoMapper框架对象映射的依据。

0bd6c6a775ae805ad92c13e164ce9e72.gif

此代码位于Application项目中以【项目名+ApplicationAutoMapperProfile】命名的类中,在构造方法中,我们可以直接调用 CreateMap<TSource, TDestination> 方法创建TSource到TDestination类型的映射关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iVX 初级工程师培训教程 10篇文拿证】01 了解 iVX 完成新年贺卡

目录 【iVX 初级工程师培训教程 10篇文拿证】01 了解 iVX 完成新年贺卡 【iVX 初级工程师培训教程 10篇文拿证】02 数值绑定及自适应网站制作 【iVX 初级工程师培训教程 10篇文拿证】03 事件及猜数字小游戏 【iVX 初级工程师培训教程 10篇文拿证】04 画布及我和 iVX 合照 【iV…

ArcGIS实验教程——实验二十六:ArcScene实现二维数据的三维显示

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 DEM三维显示: 地形数据+影像数据: 以上效果均是在ArcScene中实现的。 ArcScene允许用户制作具有透明效果的场景,在场景中能对数据进行浏览和交互。ArcAcene支持复杂的3D符号系统及纹理制图,支…

用Swashbuckle(swagger-ui)显示API帮助并进行调试

安装Swashbuckle&#xff1a; 打开NuGet控制台输入&#xff1a; Install-Package Swashbuckle 进行安装。查看帮助 在浏览器输入 http://调试项目地址/swagger/ui/index 可以看到帮助的效果API调试 点开调试的条目&#xff0c;填写相关参数&#xff0c;“Try it out!”

Linux两块磁盘挂载指向一个文件夹LVM磁盘管理(一)

注意&#xff1a;任何磁盘的操作有可能损坏里面数据&#xff0c;请提前备份数据&#xff0c;切记&#xff01;切记&#xff01;切记&#xff01; 0x00&#xff1a;前言. 在Linux使用过程中&#xff0c;发现一个文件很大&#xff0c;比如5G&#xff0c;但是有两块物理磁盘一个剩…

盘点现有开源软件许可合规工具

&#xff5c;原文出处&#xff1a;The Openchain Reference Tooling Work Group&#xff5c;翻译&#xff1a;刘天栋.Ted&#xff0c;开源社.ONES&#xff08;开源战略研究组&#xff09;&#xff5c;编辑&#xff1a;胡湘月&#xff5c;设计&#xff1a;周颖引言开源软件已经吞…

【前端就业课 第一阶段】HTML5 零基础到实战(十一)canvas 基础

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

【遥感数字图像处理教程】理论基础知识目录(5章全)

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 遥感数字图像的处理&#xff0c;是对遥感数字图像的计算机处理。与工业和医学数字图像不同&#xff0c;遥感数字图像类型更为多样&#xff0c;内容更为复杂。因此&#xff0c;遥感数字图像的处理&#xff0c;不仅需要掌握…

MonoRail学习笔记十一:页面控件的填充和验证

Mono提供很多组件可以方便的处理页面&#xff1a;可以自动将后台的值填充到页面&#xff0c;可以自动进行Javascript验证&#xff0c;可以自动在后台验证等。这些功能都是比较实用的&#xff0c;可以减少很多开发 FormHelper是用来对应html页面中Form内的tag的&#xff0c;可以…

JavaBean的详细及引用

1.JavaBean实际是具有统一接口格式的java类 2.JavaBean的组成&#xff1a;属性(Properties)、方法(Method)、事件(Events) 3.一个JavaBean的例子(该例子是用的Simple属性<属性在以后说>) //我遵循的习惯是类名大写&#xff0c;包名小写package com;//意思是将 FirstBean这…

驱动开发实战之TcpClient

场景模拟假设你有一批非标设备需要对接&#xff0c;你需要根据设备方提供的协议&#xff0c;为IoTGateway开发驱动&#xff0c;进行数据交互。文章比较长也可以到官网会有更好的体验&#xff0c;地址:http://iotgateway.net/docs/iotgateway/driver/tcpclient请先浏览上一篇驱动…

【遥感数字图像处理实验】Erdas版详细图文实验教程(8实验全)

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 遥感数字图像的处理&#xff0c;是对遥感数字图像的计算机处理。与工业和医学数字图像不同&#xff0c;遥感数字图像类型更为多样&#xff0c;内容更为复杂。因此&#xff0c;遥感数字图像的处理&#xff0c;不仅需要掌握…

WEBAPI 增加身份验证 (OAUTH 2.0方式)

1&#xff0c;在Webapi项目下添加如下引用&#xff1a;Microsoft.AspNet.WebApi.OwinOwinMicrosoft.Owin.Host.SystemWebMicrosoft.Owin.Security.OAuthMicrosoft.Owin.Security.CookiesMicrosoft.AspNet.Identity.OwinMicrosoft.Owin.Cors2&#xff0c; 在项目下新建Startup类…

无代码iVX编程实现简单 小蜜蜂 经典游戏

首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后选择相对定位&#xff0c;咱们选择2D游戏类型制作一个简单小蜜蜂游戏&#xff1a; 接着咱们创建一个物理世界&#xff0c;并且将页面布局如以下&#xff1a; 以上布局中&#xff0c;矩形为模拟飞机、…

【无人机航空摄影测量精品教程】目录:Pix4d、EPS、CC、PhotoScan、Godwork项目化作业流程及注意事项汇总

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 该专栏为目前最为热门的无人机航测内外业项目&#xff0c;主要内容包括&#xff1a;无人机航测外业作业流程&#xff08;像控点布设、航线规划、仿地飞行、航拍&#xff09;和内业数据处理软件&#xff08;Pix4d、CC、EP…

WPF 基础控件之 Slider 样式

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButtonSlider 实现下面的效果1&#xff09;Slider来实现动画&#xff1b;Grid嵌套 Border并设置S…

SQL 通过syscolumns.xtype动态查找指定数据类型字段所包含的数据

表中太多列&#xff0c;只想查找某些比如&#xff0c;数据类型为varchar的字段的数据。 思路&#xff1a;1、先获取列名&#xff1a; select * from syscolumns where id(select max(id) from sysobjects where xtypeu and nametest_A)2、查找指定数据类型&#xff0c;xtype就…

css案例学习之span边框实现的特殊效果

bottom left bottom right top left top right 配合颜色来使用&#xff0c;实现一些神奇的效果 #menu a span{height:0;width:0;/*border-top:solid 6px #fff;border-left:solid 6px #f90;*//*border-top:solid 6px #fff;border-right:solid 6px #f90;*//*border-bottom:solid …

网页版消消乐快速实现,无代码吗iVX 真那么简单?

最近没事想做个消消乐&#xff0c;然后听说 iVX 免费了&#xff0c;所以又跑去看看 iVX 了&#xff0c;就用一个无代码来看看消消乐怎么玩吧。 首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后咱们不需要游戏类型也可以制作一个消消乐游戏&#xff1a…

虚拟化记录--No.1

近段时间&#xff0c;会花些时间做关于系统虚拟化的工作。所以会做一些这样的记录。相信很多东西不会特别成体系&#xff0c;每个人因为关注的不同而记录和学习的重点也会有比较大的出入。这篇是NO.1(注意不是TOP 1 )真的是由于对于ORACLE很有感觉&#xff0c;所以上手去做的也…

C# Java间进行RSA加密解密交互

这里&#xff0c;讲一下RSA算法加解密在C#和Java之间交互的问题&#xff0c;这两天纠结了很久&#xff0c;也看了很多其他人写的文章&#xff0c;颇受裨益&#xff0c;但没能解决我的实际问题&#xff0c;终于&#xff0c;还是被我捣鼓出来了。 首先&#xff0c;介绍一下写这代…