目录

  • ABP概念简述
  • ABP在【事务操作】上的简便性
  • ABP在【关联查询】上的“美”和“坑”
  • ABP的【参数验证】方式

ABP概念简述

ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。它基于DDD的经典“分层架构”思想,开发了便捷的功能模块。

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最佳实践的更多相关文章

  1. 再谈RESTAPI最佳实践

    近一年半,我参与了两到三个项目的工作,这些项目涉及到大量供“外部”使用的REST API,稍后我们会看到为什么要将“外部”这个词放在引号之中.在项目工作期间,我不得不对这些API进行反复地设计,再设计 ...

  2. 浅谈Abp vNext的模块化设计

    abp的模块化给我留下深刻的印象,模块化不是什么新概念,大家都习以为常,但是为什么要模块化,模块化的意义或者说目的是什么?也许我们思考得并不深入.难得的是abp不仅完美的阐述了模块化概念,而且把模块化 ...

  3. [小北De编程手记] : Lesson 05 玩转 xUnit.Net 之 从Assert谈UT框架实践

    这一篇,本文会介绍一下基本的断言概念,但重点会放在企业级单元测试的相关功能上面.下面来跟大家分享一下xUnit.Net的断言,主要涉及到以下内容: 关于断言的概念 xUnit.Net常用的断言 关于单 ...

  4. MaxCompute 构建企业云数据仓库CDW的最佳实践建议

    在本文中阿里云资深产品专家云郎分享了基于阿里云 MaxCompute 构建企业云数据仓库CDW的最佳实践建议. 本文内容根据演讲视频以及PPT整理而成. 大家下午好,我是云郎,之前在甲骨文做企业架构师 ...

  5. 【转】.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 ...

  6. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  7. 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招

    朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...

  8. Abp集成Swagger的最佳实践

    1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...

  9. MySql主从配置实践及其优势浅谈

    MySql主从配置实践及其优势浅谈 1.增加两个MySQL,我将C:\xampp\mysql下的MYSQL复制了一份,放到D:\Mysql2\Mysql5.1 修改my.ini(linux下应该是my ...

随机推荐

  1. django中django.conf.urls.url函数

    在urls.py文件中,我们经常会看到类似于这样的代码: urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_arc ...

  2. K8S调度之标签选择器

    Kubernetes 调度简介 除了让 kubernetes 集群调度器自动为 pod 资源选择某个节点(默认调度考虑的是资源足够,并且 load 尽量平均),有些情况我们希望能更多地控制 pod 应 ...

  3. __metaclass__ 实现单列模式

    class Singleton(type): """Singleton. @see: http://stackoverflow.com/questions/6760685 ...

  4. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

  5. json转java对象

    用了平台之后很少再接触到java和js的底层代码,前几天远程帮一个萌新远程调试代码,这个萌新按照网上的教程去将json字符转java对象却一直报错.真相是它的json字符串格式不对,他的明明是一个数组 ...

  6. ffmpeg的API函数用法 :sws_scale函数的用法-具体应用

    移植ffmpeg过程中,遇到swscale的用法问题,所以查到这篇文章.文章虽然已经过去很长时间,但是还有颇多可以借鉴之处.谢谢“咕咕钟. 转自:http://guguclock.blogspot.c ...

  7. 2015/11/6用Python写游戏,pygame入门(6):控制大量的对象

    昨天我们已经实现了这个游戏的三个基本类. 但是现在它还是没办法做成一个适合玩的游戏,毕竟只有一架敌机的游戏是很乏味的.所以,我们需要好多子弹,也需要好多敌机. 所以,我们要创建list,这个list存 ...

  8. SQL语句(十九)——存储过程(练习)

    select * From Student select * From Course select * from SC --INSERT INTO SC (Sno, Cno, Grade) --VAL ...

  9. Git为某个域名设置代理

    打开Git 配置文件 vi ~/.gitconfig 添加如下配置: [http "https://github.com/"] proxy = http://127.0.0.1:1 ...

  10. Spring Aop、拦截器、过滤器的区别

    Filter过滤器:拦截web访问url地址.Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问.Spring AOP拦截器:只能拦截Spring管理Bean的访 ...