ABP之什么是ABP(ASP.NET Boilerplate)
1.介绍
ABP是开源的且文档比较齐全的应用程序框架。其实它不仅仅是个框架,考虑其最佳实践,ABP更提供了基于领域驱动设计(DDD)的强大价格模型。
ABP支持最新的ASP.NET Core和EF Core,同时也支持ASP.NET MVC 5.x和EF 6.x.
2.快速看一个示例
public class TaskAppService : ApplicationService, ITaskAppService
{
private readonly IRepository<Task> _taskRepository; public TaskAppService(IRepository<Task> taskRepository)
{
_taskRepository = taskRepository;
} [AbpAuthorize(MyPermissions.UpdateTasks)]
public async Task UpdateTask(UpdateTaskInput input)
{
Logger.Info("Updating a task for input: " + input); var task = await _taskRepository.FirstOrDefaultAsync(input.TaskId);
if (task == null)
{
throw new UserFriendlyException(L("CouldNotFindTheTaskMessage"));
} input.MapTo(task);
}
}
上面是一个Application Service 方法示例,DDD中方的Application Service直接由表示层调用来执行应用程序的用例。
将UpdateTask看成是JavaScript通过AJAX调用的方法。
3.ABP的优势
依赖注入(DI):ABP提供了传统的DI基础设施,由于此类是应用程序服务,因此它通常在DI容器中注册为瞬态(根据请求创建). 它可以简单地注入任何依赖项(例如此示例中的IRepository <Task>)。
仓储:ABP可以为每个实体创建一个默认存储库(例如本例中的IRepository <Task>)。 默认存储库有许多有用的方法,例如本例中使用的FirstOrDefault方法。 我们可以扩展默认存储库以满足我们的需求。 仓储库抽象了DBMS和ORM并简化数据访问逻辑。
授权:ABP可以声明性的检查权限,如果当前用户没有“update tasks”权限或者未登录,ABP会阻止访问UpdateTask方法。ABP不仅使用声明性属性,而且还有其他一些授权方法。
验证:ABP会自动检查输入是否为Null,它还基于标准数据注释属性和自定义验证规则验证输入的所有属性。如果请求无效,则会抛出异常并在客户端进行处理。
审计日志:根据约定和配置,为每个请求自动保存用户,浏览器,IP地址,调用服务,方法,参数,调用时间,执行时长以及其他一些信息。
工作单元:在ABP,每个应用程序服务方法默认都被假设成一个工作单元。它自动的在方法开始时创建一个连接并开始一个事务。如果这个方法没有任何异常的完成,事务会被提交并且释放连接。尽管这个方法用了不同的仓储或者方法,他们都将是原子的(事务的)。当一个事务被提交的时候,对实体的所有修改将会自动被保存。我们甚至不需要调用_repository.Update(task),如上例所示。
异常处理:在一个ABP的web应用程序中,我们几乎从来不用手动去处理异常.默认情况下所有的异常都会被自动处理!如果一个异常发生,ABP会自动记录并向客户端返回正确的结果。比如,如果这是一个AJAX请求,它返回一个JSON对象到客户端标识一个错误的发生。只有在UserFriendlyException情况下,它会隐藏真实的异常。它还可以处理客户端上的错误,并向用户展示相应的信息。
日志:我们可以使用在基类中定义的Logger对象。默认使用Log4Net,但是这个是可更改可配置的。
本地化:注意我们在抛出异常时使用了'L'方法? 这样,它会根据当前用户的文化自动进行本地化。
自动映射:在最后一行中,我们使用ABP的MapTo扩展方法将输入属性映射到实体属性。 它使用AutoMapper库来执行映射。 我们可以根据命名约定轻松地将属性从一个对象映射到另一个对象。
动态的API:TaskAppService是一个简单的类。 通常我们必须编写一个包装器API控制器来向JavaScript客户端公开方法,但ABP会在运行时自动执行该操作。 这样,我们可以直接从客户端使用应用程序服务方法。
动态AJAX代理:ABP创建代理方法,这些方法使调用应用程序服务方法就像在客户端上调用JavaScript方法一样简单。
我们可以在这个简单的类中看到ABP的好处。 所有这些任务通常需要花费很长时间,但在ABP中,框架都帮我们做了。我们只需要关注自己真正的业务。
ABP之什么是ABP(ASP.NET Boilerplate)的更多相关文章
- ABP+AdminLTE+Bootstrap Table权限管理系统第一节--使用ASP.NET Boilerplate模板创建解决方案
"abp是ASP.NET Boilerplate简称,是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板" abp官方网站: ...
- 如何使用ASP.NET Core、EF Core、ABP(ASP.NET Boilerplate)创建分层的Web应用程序(第一部分)
本文是为了学习ABP的使用,是翻译ABP官方文档的一篇实战教程,我暂时是优先翻译自己感兴趣或者比较想学习的部分,后续有时间希望能将ABP系列翻译出来,除了自己能学习外,有可能的话希望帮助一些英文阅读能 ...
- ABP(ASP.NET Boilerplate Project)学习总结
ABP(ASP.NET Boilerplate Project),现下比较流行的一种web框架,因为公司新项目准备使用这种框架,所以写下这篇文章记录下自己一步一步搭建的过程,就当做是对学习的一个总结与 ...
- ASP.NET Boilerplate终于发布v1.0了
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ABP经过2年多的开发,终于发布第一个主要版本了,谨此提醒ABP的使用者. ASP.N ...
- ASP.NET Boilerplate
I want it to be a start point for all we .NET developers, so, it will be good to develop it together ...
- ASP.NET Boilerplate 深入系列之:概述
因为项目需要,最近个人购买了一直在研究的ABP框架的一个Regular Licience,马上要用到一个实际的项目中,为了能够准确把握该框架涉及到设计思想.使用模式.内在实现细节.准备在接下来的一个月 ...
- 十一、ASP.NET Boilerplate
一.ASP.NET Boilerplate 实体是 DDD(领域驱动设计)的核心概念之一.Eric Evans 是这样描述的“很多对象不是通过它们的属性定义的,而是通过一连串的连续性事件和标识定义的” ...
- ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成
ASP.NET Boilerplate 学习 1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...
- ABP 适用性改造 - 精简 ABP CLI 生成的项目结构
Overview 不管是公司或者个人都会有不同的开发习惯,通过建立项目模板,既可以使开发人员聚焦于业务功能的开发,也可以在一定程度上统一不同开发人员之间的开发风格.在使用 ABP 框架的过程中,对于 ...
- Asp.net Boilerplate源码中NotNullAttribute的用处
看Asp.net Boilerplate 1.1.3.0源码时发现有一个NotNullAttribute的定义和27处的引用,就是不知道它的作用,当然顾名思义是可以的,就是不知道它是怎么判断的,在哪里 ...
随机推荐
- 鸟哥Linux私房菜基础学习篇学习笔记3
鸟哥Linux私房菜基础学习篇学习笔记3 第十二章 正则表达式与文件格式化处理: 正则表达式(Regular Expression) 是通过一些特殊字符的排列,用以查找.删除.替换一行或多行文字字符: ...
- sersync自动化同步部署
目录 0. 前提: 1. 部署rsync server服务 1.1 配置rsync配置文件 1.2 rsync配置文件说明: 1.3 创建密码文件修改权限600 1.4 创建提示文件(可有可无) 1. ...
- Elasticsearch之索引模板index template与索引别名index alias
为什么需要索引模板? 在实际工作中针对一批大量数据存储的时候需要使用多个索引库,如果手工指定每个索引库的配置信息(settings和mappings)的话就很麻烦了. 所以,这个时候,就存在创建索引模 ...
- 《HelloGitHub》第 30 期
公告 截止到第 30 期,贡献者 终于到达 3 位数-- 100 位.谢谢各位的支持和贡献,想要加入的小伙伴,快来推荐项目吧! <HelloGitHub>第 30 期 兴趣是最好的老师,H ...
- 一个简洁的小H车调运模型
一个简洁的小H车调运模型 不久前, 帝都B城市到处都是小H车, 理想的小H车应该是布朗运动\均匀分布,可是现实上它们就是不均匀.于是有如下问题: 观察帝都 HD区SY村区域,将其划分成10个用车点,用 ...
- RabbitMQ在Windows环境下的安装与使用
Windows下安装RabbitMQ 环境配置 部署环境 部署环境:windows server 2008 r2 enterprise 官方安装部署文档:http://www.rabbitmq.com ...
- 微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
1.概述 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能.菜单分为默认菜单与个性化菜单.个性化菜单接口是为了帮助公众号实现灵活的业务运营,开发者可以通过该接口,让公众号的不同用户群 ...
- InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)
上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 p ...
- Springboot 系列(八)动态Banner与图片转字符图案的手动实现
使用过 Springboot 的对上面这个图案肯定不会陌生,Springboot 启动的同时会打印上面的图案,并带有版本号.查看官方文档可以找到关于 banner 的描述 The banner tha ...
- 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)
责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...