介绍

介绍

  我们通常会根据不同的需求来创建不同的应用程序。但是对于一些通用相似的结构总是一遍又一遍的实现,至少在某种程度上是这样的。常见的通用模块如授权、验证、异常处理、日志、本地化、数据库连接管理、设置管理、审计日志。同时,我们也在使用如分层、模块化架构,领域驱动设计,依赖注入等创建架构和最佳实践。并且尝试着基于约定俗成的原则开发应用程序。

  因为开发这些框架是非常耗时的,并且很难单独对每个工程创建,所以很多公司创建了私有的框架。使用这些私有框架,他们开发新的应用程序快速且几乎没有bug。当然,并不是所有的公司都那么幸运。大多数的公司没有时间、预算和团队开发私有框架。即使公司有能力创建这样的框架也很难编写文档、培训开发者并且经常维护。

  ASP.NET Boilerplate(ABP)是开源且文档友好的应用程序框架,立意于为所有的公司和开发者开发一个通用的框架。ABP不仅仅是一个框架,同时基于领域驱动和最佳实践提供了强大的架构模型。

快速示例

我们来通过一个简单的类来看下APB的好处:

public class TaskAppService : ApplicationService, ITaskAppService
{
private readonly IRepository<Task> _taskRepository; public TaskAppService(IRepository<Task> taskRepository)
{
_taskRepository = taskRepository;
} [AbpAuthorize(MyPermissions.UpdatingTasks)]
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("CouldNotFoundTheTaskMessage"));
} input.MapTo(task);
}
}

  这里我们看到了一个应用服务方法。在领域驱动设计中,展示层直接使用应用服务来执行应用用例。我们可以认为UpdateTask方法是Javascript通过AJAX调用的。让我们看下ABP的好处:

  • 依赖注入:ABP使用并提供了一个强大、常规的DI基础设施。因为这个类是一个应用服务,所以应该以transient(每次请求的时候创建)的形式注册到DI容器中。可以简单注入所有的依赖(如在本例中的IRepository<Task>)。
  • 仓库:ABP为每个实体(如本例中的IRepository<Task>)创建一个默认的仓库。默认仓库有许多有用的方法如在本例中使用的FirstOrDefault。我们可以基于我们的需求很方便的库扩展默认仓库。仓库提取DBMS、ORMs并且简化数据访问逻辑。
  • 授权:ABP可以检查权限。如果当前用户没有“updating task”权限或者没有登录的话,ABP会禁止访问UpdateTask方法。ABP使用声明特性简化了授权,但是还有其他的授权方式。
  • 验证:ABP会自动检测输入是否为null。ABP会基于标准数据注解特性和自定义规则验证输入的所有属性。如果请求无效,ABP会抛出恰当的验证异常。
  • 审计日志:对于每一次请求,ABP会根据约定、配置将用户、浏览器、IP地址、调用服务、方法、参数、调用时间、执行时长和其他信息自动保存下来。
  • 工作单元:在ABP中,每一个应用服务方法默认为一个工作单元。ABP会自动创建连接并且在方法开始执行的时候创建事务。如果方法执行完成,没有发生异常,事务就会提交,释放连接。即使方法中使用了不同的仓库或者方法,所有的操作都是原子的(事务处理的)。所有对实体的更改都会随着事务的提交自动保存。因此,我们不需要调用_repository.Update(task)方法。
  • 异常处理:在网络应用中使用ABP我们不需要处理任何异常。所有的异常默认都会被自动处理。如果发生了异常,ABP会自动记录并且返回一个恰当的结果到客户端。例如,如果一个AJAX请求发生了异常,ABP会返回一个JSON到客户端,表明发生了错误。如果想从客户端隐藏真正的异常,除非在后台使用用户友好的异常,如本例中使用的那样。用户友好错误异常在客户端处理,可以使用合适的信息提示给用户。
  • 日志:如你所见,我们可以使用基类中的Logger对象记录日志。默认使用Log4Net,可以通过更改或配置使用其他类库。
  • 本地化:注意到当抛出异常的时候,我们使用了L方法。因此ABP会基于当前用户的文化自动本地化。当然,我们在某些地方定义了CouldNotFoundTheTaskMessage(更多信息可以去本地化文档http://www.aspnetboilerplate.com/Pages/Documents/Localization查看)。
  • 自动映射:在本例的最后一行我们使用了ABP的MapTo扩展方法把输入属性映射到了实体属性。ABP使用AutoMapper类库执行映射。因此,只要对象的属性命名是基于命名规则的,我们就可以很容易,从一个对象得属性映射到另一个对象的属性。
  • 动态WebAPI层:TaskAppService实际上是一个非常简单的类(甚至不需要从ApplicationService传输)。我们通常会封装一个Web API控制器向Javascript客户端提供方法,ABP会在运行时自动帮我们完成这些操作。因此,我们可以直接在客户端调用应用服务方法。
  • 动态JavaScript AJAX代理:ABP会创建JavaScript代理方法,这些方法使我们在客户端调用应用服务方法就像调用JavaScript方法那么简单。

  通过这么简单的一个例子我们看到了ABP的好处。这些所有的工作正常来讲会耗费大量的时间来完成,但是在ABP中这些都被自动处理了。

还有什么

  除了这个简单的例子,ABP提供了强大的基础设施和应用模型。下面ABP的其他一些特征:

  • 模块化:提供了强大的基础设施创建可服用的模块。
  • 数据过滤器:提供了自动数据过滤来实现像软删除、多租户这样的模式。
  • 多租户:ABP完全支持多租户,包括单数据库或每个租户一个数据库的架构。
  • 配置管理:提供强大的基础设施获取或更改应用、租户和用户级别的配置。
  • 单元集成测试:ABP天生是易测试的。ABP提供了基类简化单元集成测试。可以查看这篇文档(https://www.codeproject.com/articles/871786/unit-testing-in-csharp-using-xunit-entity-framewor)获取更多信息。

  要查看ABP所有的特征,查看此文档。(http://www.aspnetboilerplate.com/Pages/Documents

启动模板

  开始一个工程,创建分层,安装nuget包,创建简单布局和菜单等等,所有这些操作是非常耗时的工作。

  ABP提供了预先创建好的启动模板,这样开始一个新工程就简单多了。模板支持SPA(单页面应用)和MPA(多页面应用)架构,同时允许用户使用不同的ORM。

怎样使用

  ABP使用GitHub做源代码管理,同时也发布到Nuget上了。最简单的开始使用ABP的方式就是创建一个启动模板然后跟着文档(http://www.aspnetboilerplate.com/Pages/Documents)来学习。

返回主目录

ABP官方文档翻译 1.1 介绍的更多相关文章

  1. 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  2. ABP官方文档翻译 2.5 设置管理

    设置管理 介绍 关于 ISettingStore 定义设置 设置范围 重写设置定义 获取设置值 服务端 客户端 更改设置 关于缓存 介绍 每个应用都需要存储设置,并且在应用的某些地方需要使用这些设置. ...

  3. ABP官方文档翻译 10.1 ABP Nuget包

    ABP Nuget包 Packages Abp Abp.AspNetCore Abp.Web.Common Abp.Web Abp.Web.Mvc Abp.Web.Api Abp.Web.Api.OD ...

  4. ABP官方文档翻译 9.2 Entity Framework Core

    Entity Framework Core 介绍 DbContext 配置 在Startup类中 在模块PreInitialize方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...

  5. ABP官方文档翻译 8.2 SignalR集成

    SignalR集成 介绍 安装 服务器端 客户端 建立连接 內建特征 通知 在线客户端 PascalCase与CamelCase对比 你的SignalR代码 介绍 ABP中的Abp.Web.Signa ...

  6. ABP官方文档翻译 8.1 通知系统

    通知系统 介绍 发送模型 通知类型 通知数据 通知严重性 关于通知持久化 订阅通知 发布通知 用户通知管理 实时通知 客户端 通知存储 通知定义 介绍 在系统中通知用来基于特定的事件告知用户.ABP提 ...

  7. ABP官方文档翻译 7.3 Quartz集成

    Quartz集成 介绍 安装 创建Jobs 计划安排Jobs 更多 介绍 Quartz是一个全功能的.开源的job计划安排系统,可以用在小的apps也可以用于大型的企业系统.Abp.Quartz包简化 ...

  8. ABP官方文档翻译 7.2 Hangfire集成

    Hangfire集成 介绍 ASP.NET Core集成 ASP.NET MVC 5.x集成 面板授权 介绍 Hangfire是一个综合的后台job管理器.你可以 把它集成到ABP,用来取代默认的后台 ...

  9. ABP官方文档翻译 7.1 后台Jobs和Workers

    后台Jobs和Workers 介绍 后台Jobs 关于Job持久化 创建后台Job 在队列中添加一个新Job 默认的后台Job管理器 后台Job存储 配置 禁用Job执行 异常处理 Hangfire集 ...

随机推荐

  1. UE4与Visual Studio版本对应关系

    首先,要注意,Visual Studio 2015(VS2015)默认安装时并不包含 C++ 的工具.在安装 VS2015 时,需选择 自定义 安装并勾选 C++ 组件,这对之后的工作时必须的.如果已 ...

  2. 使用Audio API设计绚丽的HTML5音乐播放器

    HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ...

  3. Android 切换主题 (二)

    Android 切换主题 (二) 背景 我原来写过一篇文章关于 android 切换主题的文章 -- Android 切换主题以及换肤的实现 , 里面介绍了如何使用 setTheme() 来切换主题, ...

  4. Objective-C实用类和协议

    Objective-C实用类和协议 目录 概述 NSObject 概述 NSObject 协议<NSObject> 类NSObject 详细方法参考文档 实用操作 是否为某个类或其子类 是 ...

  5. SSM框架---搭建

    SSM框架简介 SSM框架,是spring + spring MVC + MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统. Spr ...

  6. Linux 磁盘管理的命令

    Linux   磁盘管理 磁盘分区及挂载: 先查询系统的使用情况: 使用fdisk -l语句 查询结果: 进行磁盘的新建:***添加磁盘时系统必须处于关机状态** 在进行对系统磁盘的使用情况的查询 查 ...

  7. time-based DB

    这类时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper ...

  8. Win10图标显示不正常解决办法

    当缓存文件出现问题时,就会引发系统图标显示不正常: 1.由于图标缓存文件是隐藏文件,我们需要在资源管理器中将设置改为“显示所有文件”. 2.同时按下快捷键 Win+R,在打开的运行窗口中输入 %loc ...

  9. TCP和UDP的区别?

    答:TCP提供面向连接的.可靠的数据流传输,而UDP提供的是非面向连接的.不可靠的数据流传输.TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报.TCP注重数据安全性,UDP数据传输快,因为 ...

  10. JDK动态代理实现源码分析

    JDK动态代理实现方式 在Spring框架中经典的AOP就是通过动态代理来实现的,Spring分别采用了JDK的动态代理和Cglib动态代理,本文就来分析一下JDK是如何实现动态代理的. 在分析源码之 ...