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

概述

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,一经查实,立即删除!

相关文章

IE8采用IE7模式

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> X-UA-Compatible是针对ie8新加的一个设置&#xff0c;对于ie8之外的浏览器是不识别的&#xff0c;这个区别与 content"IE7"在无论页面是否包含<!DOCTYPE>指令&#…

【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!”

Android之Fatal Exception: org.greenrobot.greendao.DaoException: Could not init DAOConfig

1 问题 release apk运行奔溃提示错误如下 Fatal Exception: org.greenrobot.greendao.DaoException: Could not init DAOConfigat org.greenrobot.greendao.h.a.<init>(DaoConfig.java:28)at org.greenrobot.greendao.b.a(AbstractDaoMaster.java:1) 2 解决办法 progu…

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

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

AOL search

AOL: American On Line转载于:https://www.cnblogs.com/sophia194910/p/5006466.html

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

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

centos 7.4 docker

centos 7.4 docker 1.查看系统版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)哈1 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 哈1-02 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 哈1-22 cat /etc/redhat…

2016-08-29

已完成&#xff1a; 1. 监督PHP后台完成学校部分接口 4. 评审添加孩子1 5. 评审安全上网 6. 评审答题器学生端 7. 认证方案初步 8. 安全网址方案初步&#xff1a;数据库搜索模式 9. 评审学习窗1 10. 评审学习窗2 11. 评审添加孩子2 12. 答题器研发启动会议 14. Log相关数据库设…

【前端就业课 第一阶段】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;不仅需要掌握…

Android OkHttp3简介和使用详解

一 OKHttp简介 OKHttp是一个处理网络请求的开源项目&#xff0c;Android 当前最火热网络框架&#xff0c;由移动支付Square公司贡献&#xff0c;用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient&#xff09;。 OKHttpGitHub地址 OKHttp优…

C语言试题一之计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写函数…

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请先浏览上一篇驱动…

php读取acc

<?PHP/*创建ADO连接*/$conn new COM("ADODB.Connection") or die ("ADO Connection faild.");$connstr "DRIVER{Microsoft Access Driver (*.mdb)}; DBQ" . realpath("DATUM/cnbt.mdb");$conn->Open($connstr);/*创建记录集查…

【遥感数字图像处理实验】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类…