What is the ASP.NET Boilerplate?

ABP 是个文档完备的开源框架。它还提供了一个基于领域驱动设计并考虑了所有最佳实践的 N 层架构模型

ABP 可工作于最新的 ASP.NET Core 和 EF Core,也支持 ASP.NET MVC 5.x 和 EF 6.x。

A Quick Sample

  1. public class TaskAppService : ApplicationService, ITaskAppService
  2. {
  3. private readonly IRepository<Task> _taskRepository;
  4. public TaskAppService(IRepository<Task> taskRepository)
  5. {
  6. _taskRepository = taskRepository;
  7. }
  8. [AbpAuthorize(MyPermissions.UpdateTasks)]
  9. public async Task UpdateTask(UpdateTaskInput input)
  10. {
  11. Logger.Info("Updating a task for input: " + input);
  12. var task = await _taskRepository.FirstOrDefaultAsync(input.TaskId);
  13. if (task == null)
  14. {
  15. throw new UserFriendlyException(L("CouldNotFindTheTaskMessage"));
  16. }
  17. input.MapTo(task);
  18. }
  19. }

以一个示例应用程序服务(Application Service)方法为例。在 DDD 中表现层直接调用应用程序服务去执行应用程序用例。假设 UpdateTask 方法在 JavaScript 中通过 AJAX 调用。

列举一些 ABP 的优势:

  • 依赖注入 Dependency Injection:ABP 使用并提供 DI。由于示例中的类是应用程序服务,因此它通常在 DI 容器中注册为 transient(根据请求创建)。可以轻松地给它注入任何依赖项(例如此示例中的 IRepository

  • 存储库 Repository:ABP 可以给每个实体创建一个默认存储库(例如示例中的 IRepository)。默认存储库有许多有用的方法,例如本例中使用的 FirstOrDefault 方法。我们可以扩展默认存储库以满足我们的需求。存储库抽象 DBMS 和 ORM 并简化数据访问逻辑

  • 权限管控 Authorization:ABP 可以声明性地检查权限。例如示例中如果当前用户没有 UpdateTasks 权限或未登录,则会其阻止访问 UpdateTask 方法。ABP 不仅支持声明性特性,还提供其他方法进行权限管控

  • 验证 Validation:ABP 自动检查输入是否为空。它还基于标准数据注释特性和自定义验证规则验证输入的所有属性。如果请求无效,它会抛出恰当的验证异常并在客户端进行处理

  • 审计日志 Audit Logging:根据约定和配置,为每个请求自动记录(Log)用户、浏览器、IP 地址、调用的服务、方法、参数、调用时间、执行持续时间和一些其他信息

  • 工作单元 Unit Of Work:在 ABP 中每个应用程序服务方法都默认视为一个工作单元。它会自动创建连接并在方法开头处开始事务。如果方法成功完成,则提交事务并释放连接。即使此方法使用不同的存储库或方法,它们都将是原子的(事务性的)。提交事务时,将自动保存实体上的所有更改。我们甚至不需要调用 _repository.Update(task) 方法,如上所示

  • 异常处理 Exception Handling:我们几乎不必手动处理 ABP 中的异常。默认情况下会自动处理所有异常!如果发生异常,ABP 会自动记录(Log)并向客户端返回恰当的结果。例如,如果是个 AJAX 请求,它会向客户端返回一个 JSON 对象,指示发生了错误。它会隐藏客户端的实际异常,除非异常是用户友好异常(UserFriendlyException),如示例中那样。它还可以理解并处理客户端错误,并向用户显示相应的消息

  • 日志 Logging:如你所见,我们可以使用基类中定义的 Logger 对象编写日志。 默认使用 Log4Net(可更改和配置)

  • 本地化 Localization:注意在示例中我们抛出异常时使用了 L 方法。这样,它就会根据当前用户的地域自动进行本地化

  • 自动映射 Auto Mapping:在示例的最后一行中,我们使用了 ABP 的 MapTo 扩展方法将输入属性映射到实体属性。它使用 AutoMapper 库来执行映射。我们可以根据命名约定轻松地将属性从一个对象映射到另一个对象

  • 动态 API 层 Dynamic API Layer:实际上,TaskAppService 是一个简单的类。我们通常必须编写一个包装器 API 控制器来向 JavaScript 客户端公开方法,但 ABP 会在运行时自动执行该操作。这样,我们可以直接从客户端调用应用程序服务方法

  • 动态 JS AJAX 代理 Dynamic JavaScript AJAX Proxy:通过 ABP 创建代理方法,使得调用程序服务方法就像在客户端上调用 JS 方法一样简单

不难看出 ABP 给这样一个简单的类带来的优势。所有这些以往需要大量时间的任务,现在都由 ABP 框架自动处理。

除了这个简单的示例,ABP 还为模块化(modularity)、多租户( multi-tenancy)、缓存(caching)、后台作业( background jobs)、数据过滤器(data filters)、设置管理(setting management)、域事件(domain events,)、单元集成测试等提供了强大的基础架构和开发模型……你只需专注业务代码,DRY!

Getting Started

你可以从启动模板(Startup Templates)或入门教程开始。

Startup Templates

可以直接通过启动模板创建一个现代化的启动项目。

Introduction - 图1

启动模板为应用程序提供了基本布局和一些常见功能。有几种不同的启动模板可供选择。

ASP.NET Core

ASP.NET MVC 5.x

访问下载页面查看更多的组合。

Introduction Tutorials

教程一步步地介绍了该框架,并向你讲解如何基于启动模板创建应用程序。

ASP.NET Core

ASP.NET MVC 5.x

Samples

示例页提供更多示例开发框架。

Community

这是一个开源项目,欢迎大家提交。