初识ABP

1.1 ABP总体介绍 - 入门介绍

ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。

它是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序基础框。

稍微正规一点的公司经过多年沉淀都形成了自己的内部软件框架,他们在开发软件的时候并不是从一片空白开始的。而是从一个非常牢固的基础平台上开始构建的。这样大大提高了开发速度,而且一种架构往往也决定了分工协作的模式。

当我们开发一个系统时,在重复:认证、验证、异常处理、日志、国际化和本地化、数据库连接管理、配置管理、 审计记录等,同时.NET有很多最佳实践:分层、模块化、DDD领域驱动、DI依赖倒置等。一个高质量的软件系统往往还有全局容错,消息队列等组件。
把上述这些组件组合到一起的时候,其复杂度会急剧上升。一般个人和小团队的技术水平,很难设计出一个均衡协调的框架,采用ABP就是基于这些惯例,来避免重复劳动,并且提供高质量、高效率的.NET开发。对于没有专职架构师的小型公司来说,选择ABP,可能是比较好的方案。

1.1.1 ABP采用了以下技术

服务器端:

  • ASP.NET MVC 5、Web API 2、C# 5.0
  • DDD领域驱动设计 (Entities、Repositories、Domain Services、Domain Events、Application Services、DTOs等) Castle windsor (依赖注入容器)
  • Entity Framework 6 \ NHibernate,数据迁移Log4Net(日志记录)
  •  AutoMapper(实现Dto类与实体类的双向自动转换)

客户端:

  • Bootstrap Less AngularJs jQuery Modernizr

  • 其他JS库: jQuery.validate、jQuery.form、jQuery.blockUI、json2

1.1.2 ABP框架的优势

<span style="color:black"><code><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> TaskAppService : ApplicationService, ITaskAppService
{
    <span style="color:#0000ff">private</span> readonly IRepository<<span style="color:#0000ff">Task</span>> _taskRepository;

    <span style="color:#0000ff">public</span> TaskAppService(IRepository<<span style="color:#0000ff">Task</span>> taskRepository)
    {
        _taskRepository = taskRepository;
    }

    [AbpAuthorize(MyPermissions.UpdateTasks)]
    <span style="color:#0000ff">public</span> async <span style="color:#0000ff">Task</span> UpdateTask(UpdateTaskInput input)
    {
        Logger.Info(<span style="color:#a31515">"Updating a task for input: "</span> + input);

        var <span style="color:#0000ff">task</span> = await _taskRepository.FirstOrDefaultAsync(input.TaskId);
        <span style="color:#0000ff">if</span> (<span style="color:#0000ff">task</span> == <span style="color:#0000ff">null</span>)
        {
            <span style="color:#0000ff">throw</span> <span style="color:#0000ff">new</span> UserFriendlyException(L(<span style="color:#a31515">"CouldNotFindTheTaskMessage"</span>));
        }

        ObjectMapper.MapTo(input, <span style="color:#0000ff">task</span>);
    }
}</code></span>
  • 依赖注入(DI):ABP提供了传统的DI基础设施,由于此类是应用程序服务,因此它通常在DI容器中注册为瞬态(根据请求创建). 它可以简单地注入任何依赖项(例如此示例中的IRepository <Task>)。
    另外附上一篇讲解 依赖注入的文章  https://www.cnblogs.com/jhli/p/6019895.html   感谢园子 名为 多安分 的园友

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

    授权:ABP可以声明性的检查权限,如果当前用户没有“update tasks”权限或者未登录,ABP会阻止访问UpdateTask方法。ABP不仅使用声明性属性,而且还有其他一些授权方法。

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

    审计日志:根据约定和配置,为每个请求自动保存用户,浏览器,IP地址,调用服务,方法,参数,调用时间,执行时长以及其他一些信息。

    工作单元:在ABP,每个应用程序服务方法默认都被假设成一个工作单元。它自动的在方法开始时创建一个连接并开始一个事务。如果这个方法没有任何异常的完成,事务会被提交并且释放连接。尽管这个方法用了不同的仓储或者方法,他们都将是原子的(事务的)。当一个事务被提交的时候,对实体的所有修改将会自动被保存。我们甚至不需要调用_repository.Update(task),如上例所示。

    异常处理:在一个ABP的web应用程序中,我们几乎从来不用手动去处理异常.默认情况下所有的异常都会被自动处理!如果一个异常发生,ABP会自动记录并向客户端返回正确的结果。比如,如果这是一个AJAX请求,它返回一个JSON对象到客户端标识一个错误的发生。只有在UserFriendlyException情况下,它会隐藏真实的异常。它还可以处理客户端上的错误,并向用户展示相应的信息。

    日志:我们可以使用在基类中定义的Logger对象。默认使用Log4Net,但是这个是可更改可配置的。

    本地化:注意我们在抛出异常时使用了'L'方法? 这样,它会根据当前用户的文化自动进行本地化。

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

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

    动态AJAX代理:ABP创建代理方法,这些方法使调用应用程序服务方法就像在客户端上调用JavaScript方法一样简单。

    我们可以在这个简单的类中看到ABP的好处。 所有这些任务通常需要花费很长时间,但在ABP中,框架都帮我们做了。我们只需要关注自己真正的业务。

1.1.3 ABP适用的场景

  中小规模WEB应用开发,可直接使用ABP框架。 较大型项目可以在ABP框架的源码基础上进行扩展,以实现分布式架构。

  注:处理高并发并不是ABP的强项。需要非常高并发的DDD框架,建议去研究netfocus的ENode。

1.2 ABP总体介绍 - 层架构体系

1.2.1 前言

为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。

为了实现分层的体系结构,ABP遵循 DDD(领域驱动设计)的原则,将工程分为四个层:

  • 展现层(Presentation):向用户提供一个接口﴾UI﴿,使用应用层来和用户﴾UI﴿进行交互。

  • 应用层(Application):应用层是表现层和领域层能够实现交互的中间者,协调业务对象去执行特定的应用任务

  • 领域层(Domain):包括业务对象和业务规则,这是应用程序的核心层。

  • 基础设施层(Infrastructure):提供通用技术来支持更高的层。例如基础设施层的仓储﴾Repository﴿可通过ORM来实现数据库交互,或者提供发送邮件的支持。

根据实际需要,可能会有额外添加的层。例如:

  • 分布式服务层(Distributed Service) :用于公开应用程序接口供远程客户端调用。比如通过ASP.NET Web API或WCF来实现。

这些都是常见的以领域为中心的分层体系结构。不同的项目在实现上可能会有细微的差别.

1.2.2 ABP的体系结构

层次结构概览如下图所示:

  一个简单的解决方案,大致包含5个项目:

  一个层可以被实现为一个或者多个程序集。对于大项目的第三方依赖创建多个应用程序集这是一个好的选择﴾例如:这里的 EntityFramework﴿。还有,在有限界上下文中,每个上下文都有它自己的分层。

1.2.3 领域层

领域层是实现所有业务规则的地方。

  • 实体(Entity): 实体代表业务领域的数据和操作,在实践中,通常用来映射成数据库表。

  • 仓储(Repository): 仓储是像集合一样的对象,用来在数据源﴾数据库﴿上检索和存储实体。在领域层定义仓储,但是不实现它们。它们在基础设施层被实现。

  • 领域服务(Domain service): 当处理的业务规则跨越两个﴾及以上﴿实体时,应该写在领域服务方法里面。

  • 领域事件(Domain Event): 领域事件被用来定义特定于领域的事件,并且触发使用它们。领域服务与实体﴾以及其他领域对象﴿一起实现了不属于单个实体的业务规则。

  • 工作单元(Unit of Work): 工作单元是一种设计模式被用来管理数据库连接和事务,以及跟踪实体更改,并将这些更改保存 到数据存储中。它被定义在领域层中,但是在基础设施层实现它们。

1.2.4 应用层

  应用层提供一些应用服务(Application Services)方法供展现层调用。一个应用服务方法接收一个DTO﴾数据传输对象﴿作为输入 参数,使用这个输入参数执行特定的领域层操作,并根据需要可返回另一个DTO。在展现层到领域层之间,不应该接收或返回 实体﴾Entity﴿对象,应该进行DTO映射。 一个应用服务方法通常被认为是一个工作单元(Unit of Work)。用户输入参数的验证 工作也应该在应用层实现。ABP提供了一个基础架构让我们很容易地实现输入参数有效性验证。建议使用一种像AutoMapper这 样的工具来进行实体与DTO之间的映射。

1.2.5 基础设施层

  当在领域层中为定义了仓储接口,应该在基础设施层中实现这些接口。可以使用ORM工具,例如EntityFramework或 NHibernate。ABP的基类已经提供了对这两种ORM工具的支持。数据库迁移也被用于这一层。

1.2.6 WEB与展现层

  Web层使用ASP.NET MVC和Web API来实现。可分别用于多页面应用程序﴾MPA﴿和单页面应用程序﴾SPA﴿。 在SPA中,所有资源被一次加载到客户端浏览器中(或者先只加载核心资源,其他资源懒加载),然后通过AJAX调用服务端 WebApi接口获取数据,再根据数据生成HTML代码。不会整个页面刷新。现在已经有很多SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可以使用任何类似的前端框架,但是ABP提供了一些帮助类,让我们更方便地使用 AngularJs和DurandalJs。 在经典的多页面应用(MPA)中,客户端向服务器端发出请求,服务器端代码(ASP.NET MVC控制器)从数据库获得数据,并 且使用Razor视图生成HTML。这些被生成后的HTML页面被发送回客户端显示。每显示一个新的页面都会整页刷新。 SPA和MPA涉及到完全不同的体系结构,也有不同的应用场景。一个管理后台适合用SPA,博客就更适合用MPA,因为它更利 于被搜索引擎抓取。 SignalR是一种从服务器到客户端发送推送通知的完美工具。它能给用户提供丰富的实时的体验。 已经有很多客户端的 Javascript框架或库,JQuery是其中最流行的,并且它有成千上万免费的插件。使用Bootstrap可以让我们更轻松地完成写Html 和CSS的工作。 ABP也实现了根据Web API接口自动创建 Javascript的代码函数,来简化JS对Web Api的调用。还有把服务器端的菜单、语言、 设置等生成到JS端。(但是在我自己的项目中,我是把这些自动生成功能关闭的,因为必要性不是很大,而这些又会比较影响 性能)。 ABP会自动处理服务器端返回的异常,并以友好的界面提示用户。

1.2.7 其它

ABP使用Castle Windsor为整个程序框架提供依赖注入的功能。使用Log4Net日志记录组件,提供给其他各层调用以进行日志记 录。

发布了45 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36730649/article/details/103424877
ABP