我们可以很容易的基于命名约定(简单来讲就是属性名相同

时间:2021-09-21 03:26:26

在14,15年间辅导几个差此外团队,交付了几个项目,在这个过程中,虽然几个项目的业务不一样,但是很多应用措施架构根本性的成果倒是大同小异,例如认证、授权、请求验证、异常措置惩罚惩罚、DTO、日志、审计、按时任务、调理、多语言、应用配置打点等等这些成果。但是由于项目受限于进度、资源、团队成员的配景,在其时却难于做到各个项目的统一,只能用拷贝的方法,然后在欠亨的项目中各自再按照各自的需求去做改造。这促使我下定决心去整理实现一个通用的应用措施级另外框架,来提升项目交付的效率和质量。

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

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

什么是ABP

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

快速示例

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

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

仓储 - ABP可以为每一个实体都创建一个默认仓储,在示例中是IRepository

授权- ABP可以使用声明式的方法来查抄权限。在示例中,如果一个用户没有登录,或者没有“UpdateTasks”的权限,那么他将不能访谒UpdateTask要领。 ABP不仅单使用声明式的特性来查抄权限,它还供给了其他的授权方法

请求验证- ABP自动的查抄请求输入(input)是否为null, 并且可以基于标准的数据注解和自界说验证法则来查抄输入中的属性是否合法。如果请求不同法,它将会抛出一个验证异常。

审计日志- ABP会基于惯例和配置,自动为每一个请求记录访谒的用户、浏览器、IP地点、挪用的处事、要领、参数、挪用时间、耗时、和其它一些信息。

事情单元- 在ABP中,每个应用处事要领,都被默认视为一个事情单元. 在进入要领时,ABP会自动的打开连接并开启事务,如果要领在执行过程没有任何异常,并且告成完成,那么在退出要领时,ABP会自动提交事务并释放连接。不管要领中使用了一个还是多个仓储,他们都是原子的,在一个事务中,所有的实体转变城市在事务提交时自动生存。正如示例中所示,我们甚至都不用挪用显示的 ‘_repository.Update(task)‘要领来生存数据更新。 不过我小我私家建议尽管可以不显示挪用更新,但是从代码的可读性和可维护性还是显示的挪用‘_repository.Update(task)‘要领

异常措置惩罚惩罚- 在ABP我们几乎不用手动的来措置惩罚惩罚异常,ABP会默认自动措置惩罚惩罚所有异常。如果有异常产生,ABP会自动的记录它,并返回合适的功效给客户端。例如,如果这是一个AJAX请求,它会返回一个JSON东西给客户端,并指明有一个错误产生。它会向客户端隐藏真实的异常,除非我们使用UserFriendlyException.