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
ASP.NET MVC 5.x
访问下载页面查看更多的组合。
Introduction Tutorials
教程一步步地介绍了该框架,并向你讲解如何基于启动模板创建应用程序。
ASP.NET Core
ASP.NET MVC 5.x
Samples
示例页提供更多示例开发框架。
Community
这是一个开源项目,欢迎大家提交。
Github 仓库提供最新的源码和 issues
使用 aspnetboilerplate tag on stackoverflow 在 SOF 上讨论 ABP 的使用问题
关注 aspboilerplate on twitter 了解项目进展