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
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)方法为例。在 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
可以直接通过启动模板创建一个现代化的启动项目。
启动模板为应用程序提供了基本布局和一些常见功能。有几种不同的启动模板可供选择。
ASP.NET Core
- Single Page Application with ASP.NET Core & Angular
- Multi-Page Application with ASP.NET Core & jQuery
ASP.NET MVC 5.x
访问下载页面查看更多的组合。
Introduction Tutorials
教程一步步地介绍了该框架,并向你讲解如何基于启动模板创建应用程序。
ASP.NET Core
- Introduction with ASP.NET Core & Entity Framework Core
- Developing a multi-tenant (SaaS) application with ASP.NET Core, EntityFramework Core & Angular
ASP.NET MVC 5.x
- Introduction with ASP.NET MVC 5.x, Web API 2.x, EntityFramework 6.x & AngularJS 1.x
- Developing a multi-tenant (SaaS) application with ASP.NET MVC 5.x, EntityFramework 6.x & AngularJS 1.x
Samples
示例页提供更多示例开发框架。
Community
这是一个开源项目,欢迎大家提交。
- Github 仓库提供最新的源码和 issues
- 使用 aspnetboilerplate tag on stackoverflow 在 SOF 上讨论 ABP 的使用问题
- 关注 aspboilerplate on twitter 了解项目进展