浅谈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 ...
随机推荐
- C语言基础语法
#include <stdio.h> int main() { int age; printf("input your age"); scanf("%d&qu ...
- Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap
声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...
- angularjs的Controller as
<html ng-app="notesApp"> <head><title>Notes App</title></head&g ...
- vue 配置环境遇到的问题总结
之前Vue的官网上对于vue-cli脚手架搭建环境是这样的几步: npm install --global vue-cli vue init webpack my-project cd my-proj ...
- 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controller)
参考链接: 依赖注入(DI) or 控制反转(IoC) laravel 学习笔记 —— 神奇的服务容器 PHP 依赖注入,从此不再考虑加载顺序 名词解释 IoC(Inversion of Contro ...
- Java入门系列(四)内部类
为什么需要内部类? 真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题没有多继承.实际上,C++的多继承设计起来很复杂,而java通过内部类加 ...
- Asp.net 中,在服务端向客户端写脚本的常用方法
在Asp.net 服务端处理脚本,一般都用 ClientScriptManager ,即web窗体服务端的this.ClientScript.该对象比较常用的方法: 1.RegisterArrayDe ...
- 活学活用,CSS清除浮动的4种方法
清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近. CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受. 1.结尾处加空div标签 ...
- 【转】WPF的知识
[-] 闲话WPF之二XAML概述 闲话WPF之五XAML中的类型转换 闲话WPF之十六WPF中的资源 2 闲话WPF之十九WPF中的传递事件 1 闲话WPF之二十WPF中的传递事件 2 闲话WPF之 ...
- 配置SpringBoot-从日志系统配置说起
大小系统都需要打日志. 系统在不同环境下对日志的配置要求是不一样的 比如 开发本地: 直接输出到控制台 生产环境: 输出到文件或者额外的日志收集系统, 比如 graylog. (本文不探讨具体日志系统 ...