浅谈ABP最佳实践
目录
- ABP概念简述
- ABP在【事务操作】上的简便性
- ABP在【关联查询】上的“美”和“坑”
- ABP的【参数验证】方式
ABP概念简述
ABP在【事务操作】上的简便性
以一个最简单的学生选课为例,包含学生、课程、选课结果三个实体。

在学生选课过程中,当学生选课后,会进行两个操作:
1.增加学生选课记录。
2.增加课程班级人数。
这两个过程应该是事务型的操作,如果某个过程失败,则整个过程回滚。
在基于EntityFramework的框架中,通过可以使用TransactionScope实现
using (TransactionScope tran = new TransactionScope())
{
...
tran.Complete();
}
在ABP中实现如下,在AddSC()方法中不用任何关于事务的声明语句,使得整个过程的非常便捷。

这是因为ISCService继承了IApplicationService服务,IApplicationService即为“应用程序层”的基类。
ABP框架在“应用程序层”具有先天的事务性。所以在程序中,无须声明事务范围,实体更新后也不用saveChanges()。
“应用程序层”中的方法都被默认成了事务型操作。当方法成功执行后,会自动提交到数据库;当方法中的任意一个操作失败,整个操作都会自动回滚。
此外,如果某个“应用程序层”的方法对底层数据库只有查询操作,也可以给方法添加Attribute标签:[UnitOfWork(false)],来取消对某个方法的事务性限制。
ABP在【关联查询】上的“美”和“坑”
如果想查看某个学生所有的选课记录,在ABP中是很容易实现的。

ABP通过延时加载来根据外键关系来查找,把关联查询更加简便和优雅(比EF便捷许多)。
但是不可被美色蛊惑,此处有“暗坑”:被加载的List<Models.SC>具有延时加载特性,如果延时加载的对象在该工作单元内没有被调用,则对象会在方法结尾处自动被GC回收掉。
如果要在Api层调用GetClassByStudent方法,就必须要激活延时加载的对象。延时加载的对象只要被引用,就会自动被激活。如:
...
student.SCs= student.SCs;//引用延时加载对象,从而达到激活的目的
var classes = student.SCs;
...
ABP【参数验证】方式
对某个方法的操作,对接收的参数的有效性往往需要校验,注入某些参数是必填的、某个数据的格式必须是合乎规范的等等。在.net mvc中继承Controller的类,可以通过实现接口IValidatableObject来验证mvc层的参数输入。但是无法验证非继承Controller的类。
在ABP框架中通过ICustomValidate和INormalize对所有类的参数的验证和规范化。


通过对参数有效性验证和规范化处理,使得输入参数在进入应用程序时就是符合要求的。让我们可以更专注“应用程序层”的业务逻辑。使代码更加规整,可读性也更高。
浅谈ABP最佳实践的更多相关文章
- 再谈RESTAPI最佳实践
近一年半,我参与了两到三个项目的工作,这些项目涉及到大量供“外部”使用的REST API,稍后我们会看到为什么要将“外部”这个词放在引号之中.在项目工作期间,我不得不对这些API进行反复地设计,再设计 ...
- 浅谈Abp vNext的模块化设计
abp的模块化给我留下深刻的印象,模块化不是什么新概念,大家都习以为常,但是为什么要模块化,模块化的意义或者说目的是什么?也许我们思考得并不深入.难得的是abp不仅完美的阐述了模块化概念,而且把模块化 ...
- [小北De编程手记] : Lesson 05 玩转 xUnit.Net 之 从Assert谈UT框架实践
这一篇,本文会介绍一下基本的断言概念,但重点会放在企业级单元测试的相关功能上面.下面来跟大家分享一下xUnit.Net的断言,主要涉及到以下内容: 关于断言的概念 xUnit.Net常用的断言 关于单 ...
- MaxCompute 构建企业云数据仓库CDW的最佳实践建议
在本文中阿里云资深产品专家云郎分享了基于阿里云 MaxCompute 构建企业云数据仓库CDW的最佳实践建议. 本文内容根据演讲视频以及PPT整理而成. 大家下午好,我是云郎,之前在甲骨文做企业架构师 ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招
朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...
- Abp集成Swagger的最佳实践
1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...
- MySql主从配置实践及其优势浅谈
MySql主从配置实践及其优势浅谈 1.增加两个MySQL,我将C:\xampp\mysql下的MYSQL复制了一份,放到D:\Mysql2\Mysql5.1 修改my.ini(linux下应该是my ...
随机推荐
- noi题库(noi.openjudge.cn) 3.9数据结构之C++STL T1——T2
T1 1806:词典 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一 ...
- HDU 2188 基础bash博弈
基础的bash博弈,两人捐钱,每次不超过m,谁先捐到n谁胜. 对于一个初始值n,如果其不为(m+1)的倍数,那么先手把余数拿掉,后继游戏中不管如何,后手操作后必定会有数余下,那么先手必胜,反之后手必胜 ...
- 软件测试(二)PICT的使用 组合测试方法(两两组合测试,可遍历组合测试)
一.两两组合测试 # # 两两组合测试 # PLATFORH: x86, ia64, amd64 CPUS: Single, Dual, QUad PAHL: 120MB, 1GB, 4GB, 64G ...
- PHP远程连接mysql报错处理办法
在万网弄了个虚拟主机,想远程连mysql调试(本地4G如果开mysql内存不够!),一直报错: mysqlnd cannot connect to MySQL 4.1+ using the old i ...
- 微信网页动画---swiper.animate.css
项目需要,自己写了个demo <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 重新找回spyder3-editor 里的code completion
升级到spyder3之后, 突然丢失了code autocompletion在editor context里. 觉得太不爽了. 虽然在ipython窗格里TAB键的自动完成功能依然完好. 仔细观察 T ...
- Web应用开发中的几个问题
Introduction 由于Ajax技术在Gmail中的成功应用和高性能的V8引擎的推出使得编写Web应用变得流行 起来,使用前端技术也可以编写具有复杂交互的应用.相对于native应用,Web应用 ...
- HDU 4707 Pet 邻接表实现
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4707 解题报告:题目大意是在无向图G中有n个点,分别从0 到n-1编号,然后在这些点之间有n-1条边, ...
- 27、增强for循环
增强for循环 使用增强for循环可以简化数组和Collection集合的遍历,格式: for(元素数据类型 变量 : 数组或者Collection集合) { 使用变量即可,该变量就是元素 } 例: ...
- std::max 错误
Today I typed the following: int t = (std::max)(timeout, lagtime); Why did I put parentheses around ...