前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ABP框架 - 介绍

ABP框架 - 介绍

原创
作者头像
我思故我在
发布于 2018-05-05 04:30:18
发布于 2018-05-05 04:30:18
4K3
举报
文章被收录于专栏:我思故我在我思故我在

在14,15年间带领几个不同的团队,交付了几个项目,在这个过程中,虽然几个项目的业务不一样,但是很多应用程序架构基础性的功能却是大同小异,例如认证、授权、请求验证、异常处理、DTO、日志、审计、定时任务、调度、多语言、应用配置管理等等这些功能。但是由于项目受限于进度、资源、团队成员的背景,在当时却难于做到各个项目的统一,只能用拷贝的方式,然后在不通的项目中各自再根据各自的需求去做改进。这促使我下定决心去整理实现一个通用的应用程序级别的框架,来提升项目交付的效率和质量。

在整理这个框架的过程中,参考了一些开源框架的设计和实现,无意中发现了ABP(ASP.NET Boilerplate)已经实现的正是我想要的,本着不重复造轮子的原则,在对ABP做了POC和评估后,在向整个评审小组展示时,尽管有诸多细节大家意见不尽相同,但对于整体框架却是少有的一致好评,在后来的项目交付中使用ABP也就是顺利成章的事了。当时ABP的版本还是0.5(现在的最新版本是3.5),尽管也踩了一些坑,但是总的来说还是大幅的提高了项目交付效率。

好了,废话不多说,我们进入正题。

什么是ABP

ABP(ASP.NET Boilerplate)是一个开源的应用程序框架,以帮助开发人员快速开发。但它又不仅仅是一个框架,更提供了一套基于DDD的架构模型和最佳实践。

快速示例

下面我们来研究一个最简单的示例来看看使用ABP有哪些好处

代码语言:txt
AI代码解释
复制
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类, TaskAppService, 里面定义了一个方法UpdateTask. Application Service在DDD的设计中是直接被展示层所调用的,简单来说,一个前端页面可以直接调用TaskAppService.UpdateTask.

就这个简单的示例,我们一起来看看使用ABP有哪些好处。

  • 依赖注入 - ABP提供了一个惯用的DI基础框架,所谓惯用,就是大家平常使用的DI方式一致,保持大家的使用习惯。因为这个示例是在应用服务层,所以注入容器中的实例生命周期都是短时的(每个请求创建一次,生命周期与请求相同)。 它可以简单方便的注入任何依赖,比如在本示例中的IRepository<Task>。
  • 仓储 - ABP可以为每一个实体都创建一个默认仓储,在示例中是IRepository<Task>, 默认仓储有许多非常有用的方法,例如示例中的FirstOrDefaultAsync, 并且我们可以非常容易的根据我们自己需求来扩展仓储。仓储对DBMS和ORM做了抽象并简化了数据访问逻辑。
  • 授权- ABP可以使用声明式的方式来检查权限。在示例中,如果一个用户没有登录,或者没有“UpdateTasks”的权限,那么他将不能访问UpdateTask方法。 ABP不单单使用声明式的特性来检查权限,它还提供了其他的授权方式
  • 请求验证- ABP自动的检查请求输入(input)是否为null, 并且可以基于标准的数据注解和自定义验证规则来检查输入中的属性是否合法。如果请求不合法,它将会抛出一个验证异常。
  • 审计日志- ABP会基于惯例和配置,自动为每一个请求记录访问的用户、浏览器、IP地址、调用的服务、方法、参数、调用时间、耗时、和其它一些信息。
  • 工作单元- 在ABP中,每个应用服务方法,都被默认视为一个工作单元. 在进入方法时,ABP会自动的打开连接并开启事务,如果方法在执行过程没有任何异常,并且成功完成,那么在退出方法时,ABP会自动提交事务并释放连接。不管方法中使用了一个还是多个仓储,他们都是原子的,在一个事务中,所有的实体改变都会在事务提交时自动保存。正如示例中所示,我们甚至都不用调用显示的 '_repository.Update(task)'方法来保存数据更新。 不过我个人建议尽管可以不显示调用更新,但是从代码的可读性和可维护性还是显示的调用'_repository.Update(task)'方法
  • 异常处理- 在ABP我们几乎不用手动的来处理异常,ABP会默认自动处理所有异常。如果有异常发生,ABP会自动的记录它,并返回合适的结果给客户端。例如,如果这是一个AJAX请求,它会返回一个JSON对象给客户端,并指明有一个错误发生。它会向客户端隐藏真实的异常,除非我们使用UserFriendlyException.
  • 日志- 我们可以使用基类中定义的Logger对象来写日志。 ABP默认使用Log4Net来写日志,当然我们也可以通过修改配置来使用其他的日志框架。
  • 本地化(多语言)- 在示例中,当抛出异常时,使用了"L"方法,它会根据用户文化配置自动进行本地化处理。
  • 自动映射- 在示例的最后一行,我们使用了ABP的MapTo扩展方法来讲输入对象的属性映射到实体对象的属性。它使用了AutoMapper库来执行映射,我们可以很容易的基于命名约定(简单来讲就是属性名相同,当然也可以指定)来将一个对象的属性来映射到另一个对象的属性。通常不同层都会定义自己的数据对象模型,而在层与层之间进行数据交换时,就设计到不同数据对象的转换,这个时候就是AutoMapper大显身手的好时机。
  • 动态API- TaskAppService只是一个一般的类,通常我们需要写一个Web API Controller包装器来将TaskAppService的方法以API的形式暴露给客户端调用,但是ABP在运行时已经自动为AppService的方法生成了API接口,所以这样看起来,就像是客户端直接调用了AppService的方法(但实际不是)。
  • 动态Javascript AJAX代理- ABP在前端为应用服务的调用创建了代理方法,这样就可以在前端像调用Javascript方法一样调用应用服务。

在示例中,我们可以看到使用ABP的优势,通常如果我们来做这些事情,会花费大量的时间,但是ABP框架都自动的为我们处理了。这里必须点个赞了。

此外,除了这个示例中展示的ABP的优势以外,ABP还提供了一个健壮的基础架构和应用模型。包括模块化、多租户、缓存、配置管理、调度和后台任务、数据过滤、领域时间、单元测试集成测试等等。它让我们可以集中关注在业务实现上,而不用重复的去造轮子。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
3 条评论
热度
最新
ABP框架的自动处理大大的增加了工作效率
ABP框架的自动处理大大的增加了工作效率
回复回复点赞举报
ABP还是有很多很方便的地方的
ABP还是有很多很方便的地方的
回复回复点赞举报
不错
不错
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Repository Pattern已死?深入剖析.NET中的设计模式争议与最佳实践
在.NET生态中,鲜有话题能像 仓储模式(Repository Pattern) 这般引发激烈争论。有些开发者奉其为整洁架构的基石,另一些人则认为它是被Entity Framework Core(EF Core)淘汰的冗余设计。
郑子铭
2025/05/17
730
Repository Pattern已死?深入剖析.NET中的设计模式争议与最佳实践
ABP入门系列(3)——领域层定义仓储并实现
一、先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。 在ABP中,仓储类要实现IRepository接口,接口定
圣杰
2018/01/11
1.1K0
ABP入门系列(3)——领域层定义仓储并实现
初识ABP vNext(1):开篇计划&基础知识
ABP vNext(以下简称ABP)的前身是asp.net boilerplate(老版abp),它不是一个简单的版本更新,而是完全基于.NET Core的重写。之前有听说过ABP框架,但是一直没有去详细了解。最近认真学习了一下,准备记录下自己的一些心得,计划分为3部分来进行:
用户5672425
2020/08/13
2.3K0
初识ABP vNext(1):开篇计划&基础知识
ABP入门系列(7)——分页实现
完成了任务清单的增删改查,咱们来讲一讲必不可少的的分页功能。 首先很庆幸ABP已经帮我们封装了分页实现,实在是贴心啊。 来来来,这一节咱们就来捋一捋如何使用ABP的进行分页吧。 一、分页请求DTO定义 数据传输对象(Data Transfer Objects)用于应用层和展现层的数据传输。 展现层传入数据传输对象(DTO)调用一个应用服务方法,接着应用服务通过领域对象执行一些特定的业务逻辑并且返回DTO给展现层。这样展现层和领域层被完全分离开了。在具有良好分层的应用程序中,展现层不会直接使用领域对象
圣杰
2018/01/11
1.6K0
ABP入门系列(7)——分页实现
ABP框架 - 我的第一个Web API
本文示例源代码地址https://github.com/lcyhjx/abp-training 上一篇我们已经对ABP是什么,能做什么、有了一个印象。那么接下来我们将动手使用ABP框架快速开发一个API,你将会发现使用ABP框架有多么便利,会实实在在感受到它的魅力。 环境要求 Visual Studio 2017 SQL Server .Net Core SDK 创建应用程序 我们使用ABP模板来创建应用程序,访问http://www.aspnetboilerplate.com/Templates,你将会看
我思故我在
2018/05/11
1.8K0
初识ABP vNext(11):聚合根、仓储、领域服务、应用服务、Blob储存
在前两节中介绍了ABP模块开发的基本步骤,试着实现了一个简单的文件管理模块;功能很简单,就是基于本地文件系统来完成文件的读写操作,数据也并没有保存到数据库,所以之前只简单使用了应用服务,并没有用到领域层。而在DDD中领域层是非常重要的一层,其中包含了实体,聚合根,领域服务,仓储等等,复杂的业务逻辑也应该在领域层来实现。本篇来完善一下文件管理模块,将文件记录保存到数据库,并使用ABP BLOB系统来完成文件的存储。
xhznl
2020/09/28
2K0
ABP入门系列(4)——创建应用服务
一、解释下应用服务层 应用服务用于将领域(业务)逻辑暴露给展现层。展现层通过传入DTO(数据传输对象)参数来调用应用服务,而应用服务通过领域对象来执行相应的业务逻辑并且将DTO返回给展现层。因此,展现层和领域层将被完全隔离开来。 以下几点,在创建应用服务时需要注意: 在ABP中,一个应用服务需要实现IApplicationService接口,最好的实践是针对每个应用服务都创建相应继承自IApplicationService的接口。(通过继承该接口,ABP会自动帮助依赖注入) ABP为IApplication
圣杰
2018/01/11
1.8K0
ABP入门系列(13)——Redis缓存用起来
源码路径:Github-LearningMpaAbp 1. 引言 创建任务时我们需要指定分配给谁,Demo中我们使用一个下拉列表用来显示当前系统的所有用户,以供用户选择。我们每创建一个任务时都要去数据库取一次用户列表,然后绑定到用户下拉列表显示。如果就单单对一个demo来说,这样实现也无可厚非,但是在正式项目中,显然是不合理的,浪费程序性能,有待优化。 说到优化,你肯定立马就想到了使用缓存。是的,缓存是提高程序性能的高效方式之一。 这一节我们就针对这一案例来看一看Abp中如何使用缓存来提高程序性能。
圣杰
2018/01/11
2.5K0
ABP入门系列(13)——Redis缓存用起来
ABP入门系列(17)——使用ABP集成的邮件系统发送邮件
ABP中对邮件的封装主要集成在Abp.Net.Mail和Abp.Net.Mail.Smtp命名空间下,相应源码在此。 #一、Abp集成的邮件模块是如何实现的 分析可以看出主要由以下几个核心类组成: E
圣杰
2018/01/11
3K0
ABP入门系列(17)——使用ABP集成的邮件系统发送邮件
ABP入门系列(19)——使用领域事件
源码路径:Github-LearningMpaAbp 1.引言 最近刚学习了下DDD中领域事件的理论知识,总的来说领域事件主要有两个作用,一是解耦,二是使用领域事件进行事务的拆分,通过引入事件存储,来
圣杰
2018/01/11
1.3K0
ABP入门系列(19)——使用领域事件
ABP入门系列(20)——使用后台作业和工作者
源码路径:Github-LearningMpaAbp 1.引言 说到后台作业,你可能条件反射的想到BackgroundWorker,但后台作业并非是后台任务,后台作业用一种队列且持久稳固的方式安排一些待执行后台任务。 为执行长时间运行的任务而用户无需等待,以提高用户体验。 为创建可重试且持久稳固的任务来保证一个代码将会被成功运行,以提高系统的稳定性。 那什么又是后台工作者呢? 后台工作者则是简单运行在应用程序后台的独立线程,它用于定期执行一些任务。 一个后台工作者可以定期清除临时表、重建索引。 一个后台
圣杰
2018/01/11
3.7K0
ABP入门系列(20)——使用后台作业和工作者
动态We API(ABP官方文档翻译)
这个文档是针对ASP.NET Web API的。如果你对ASP.NET Core感兴趣,请参见ASP.NET Core文档。
yaphetsfang
2020/07/30
2.9K0
ABP 框架 数据库底层迁移 Mysql 集群
我的各种github 开源项目和代码:https://github.com/linbin524
林滨
2018/12/20
2.6K0
ABP入门系列(18)—— 使用领域服务
源码路径:Github-LearningMpaAbp 1.引言 自上次更新有一个多月了,发现越往下写,越不知如何去写。特别是当遇到DDD中一些概念术语的时候,尤其迷惑。如果只是简单的去介绍如何去使用ABP,我只需参照官方文档,实现到任务清单Demo中去就可以了,不劳神不费力。但是,这样就等于一知半解。 知之为知之,不知为不知,是知也。知其然知其所以然,方能举一反三嘛。 为了揭开迷惑,最近开始研读《实现领域驱动设计》去学习DDD中的思想,并开了一个DDD专题去记录我学习的成果。欢迎大家关注,共同学习进步并
圣杰
2018/01/11
1.2K0
ABP入门系列(18)—— 使用领域服务
ABP入门系列(9)——权限管理
源码路径:Github-LearningMpaAbp 完成了简单的增删改查和分页功能,是不是觉得少了点什么? 是的,少了权限管理。既然涉及到了权限,那我们就细化下任务清单的功能点: 登录的用户才能查看任务清单 用户可以无限创建任务并分配给自己,但只能对自己创建的任务进行查找、修改 管理员可以创建任务并分配给他人 管理员具有删除任务的权限 从以上的信息中,我们可以提取出以下权限: 任务分配权限 任务删除权限 那我们下面就来实现针对这两个权限的管理: 一、ABP权限管理的实现 1、先来看看权限定义相关类型
圣杰
2018/01/11
3.7K0
ABP入门系列(9)——权限管理
ABP框架使用拦截器动态配置租户过滤器
最近项目要求在ABP框架中根据TenantId是否为空来配置是否禁用租户过滤器。ABP自身给我我们禁用租户过滤器的两种方法官方文档
心莱科技雪雁
2020/05/09
1.4K0
ABP框架 - N层架构
介绍 在应用程序设计中,分层架构是一种被广泛使用的技术,它助于降低复杂度和提高代码的可重用性。在ABP框架中,使用了DDD(领域驱动设计)的原则来实现分层架构. DDD分层架构 在DDD(领域驱动设计)架构模型中,有四个基础层。 表现层: 用户访问接口。使用应用层来实现与用户交互。 应用层: 应用层是表现层和领域层之间的媒介,它负责组织和编排业务对象来执行特定的应用任务。, 领域层:定义业务对象、逻辑和规则,它是整个应用的核心。 基础设施层:为上层提供通用的技术支持,大多数情况会使用第三方库。
我思故我在
2018/05/11
1.2K0
Asp.net+Vue2构建简单记账WebApp之二(使用ABP迅速搭建.Net后台)
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。详情可以访问官网:http://www.aspnetboilerplate.com/
易兒善
2018/08/21
1.1K0
Asp.net+Vue2构建简单记账WebApp之二(使用ABP迅速搭建.Net后台)
.Net Core + DDD基础分层 + 项目基本框架 + 个人总结「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说.Net Core + DDD基础分层 + 项目基本框架 + 个人总结「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/02/16
5.4K0
.Net Core + DDD基础分层 + 项目基本框架 + 个人总结「建议收藏」
ABP+AdminLTE+Bootstrap Table权限管理系统一期
   学而时习之,不亦说乎,温顾温知新,可以为师矣.
远志
2018/01/24
2.4K0
ABP+AdminLTE+Bootstrap Table权限管理系统一期
推荐阅读
相关推荐
Repository Pattern已死?深入剖析.NET中的设计模式争议与最佳实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档