什么是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, 默认仓储有许多非常有用的方法,例如示例中的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还提供了一个健壮的基础架构和应用模型。包括模块化、多租户、缓存、配置管理、调度和后台任务、数据过滤、领域时间、单元测试和集成测试等等
标签:调用,框架,示例,介绍,ABP,input,TaskAppService,方法 From: https://www.cnblogs.com/lllxxxyyy/p/17672890.html