自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可能是不怎么用github,可能的原因就是英文不好。所以还是希望程序员多看看英文文档,一开始看得很慢不要紧,时间久了,速度绝对能上去。因为都是技术性的文章,没有特别难的语法,能让大家退而却步的最多是些生词,这个就要靠大家积累常见的词汇了,一些生僻词的话查一下意思,理解了那句话就可以过了。
跟ABP相关的所有源码,包括zero,demo,都在这个目录下了,大家可以一个个点击看一下。下面做一稍微解释。
对应用代码基进行分层可以帮助降低复杂度和提高代码复用性,这已经成为广为接受的技巧。为了实现分层的架构,ABP遵循以下* DDD(领域驱动模型) 的原则。在DDD中,有四个基础层:
也可能会加入额外必要的层。以下就是一个例子:
这些都是以领域为中心的架构的通用层次。基于实现的话,可能还会稍有不同。
层次和结构的概览如下图所示:
实际解决方案中的项目分层如下:
一层可以为一个或多个程序集。对于第三方依赖创建不止一个程序集可能会特别好(比如NHibernate)。
领域层是所有的业务规则实现的地方。
实体代表了业务领域的数据和操作。在实践中,它们一般会映射到数据库的表中。
仓储式跟集合很像的对象,使用仓储可以检索数据源(数据库)上的实体,并将实体持久化到数据源上。领域层只是定义了仓储,但是并没有实现它们,它们是在基础设施层实现的。
领域事件定义了领域特定的事件,也包括触发和处理这些事件。领域服务借助实体运行,并实现了不属于单个实体的业务规则。
工作单元是一种管理实体的设计模式,这些实体受业务逻辑影响,并将状态持久化到数据存储中。
领域层应该尽可能地独立于第三方的库。
应用层包含了展现层使用的应用服务。应用服务方法接收一个DTO(数据传输对象)作为输入参数,使用这个输入对象执行一些特定的领域层操作,然后,如果需要的话,可能返回另一个DTO。一般而言,应用服务方法不接收或者返回一个实体对象,这样做的好处就是可以允许展现层可以从领域层中将实体抽象出来,而不受实体的约束。一个应用服务方法一般被看作是一个工作单元。用户输入验证也是在这一层实现的。ABP提供了一个基础设施,因此可以很容易地实现验证。建议使用一个将实体映射为DTO的工具,比如AutoMapper,TinyMapper等。要学习AutoMapper的使用,请查看我的 AutoMapper系列博客 吧!
虽然领域层定义了仓储接口,但是基础设施层使用诸如NHibernate或者EntityFramework的ORM工具实现了那些仓储接口。ABP提供了使用这两种ORM框架的基类。基础设施层用于抽象来自其他层的第三方类库,数据库迁移(Database Migration)也可以用在这一层。
Web层使用ASP.NET MVC和Web API实现的。这里可以使用两种不同的方式来实现:单页面应用和多页面应用。
在单页面应用中(SPA),所有的资源都会一次性加载到客户端(或者只加载核心资源,懒加载其他资源),所有的后续和服务器的交互都是通过Ajax调用。Html代码是使用从服务端接收到的数据在客户端生成的。整个页面不会刷新,视图只是在必要时换入换出。有许多的Javascript SPA框架,比如AngularJs,DurandalJs,BackboneJs和EmberJs。ABP可以使用它们中的任何一个,但是提供了使用 AngularJs和DurandalJs的样例。
在多页面(经典)应用中(MPA),客户端向服务端发送请求,服务端代码(ASP.NET MVC 控制器)从数据库中获取数据,然后Razor视图引擎生成html 代码。这些编译后的页面发回给客户端显示。每个新的页面都会导致完整页面的刷新。
SPA和MPA涉及了完全不同的架构。对于后台管理系统来说,SPA是最好的候选者,另一方面,博客更适合MPA模型,因为博客渴望被搜索引擎抓取数据。虽然有很多工具可以使SPA对于搜索引擎可见,但是目前的一般做法就是使用MPA。
SignalR是发送服务端到客户端的推送通知的最好工具,也可以给用户提供一个丰富而且实时的体验。
在客户端还有很多javascript库和框架。 jQuery 是这个领域最流行的,并伴有成千上万的插件。也有很多很容易就能使用Html和CSS的框架或工具。比如, Twitter Bootstrap 是非常流行的HTML/CSS框架。
ABP提供了使用应用服务层自动创建Web API层的基础设施,使用Javascript可以轻松地调用Web API( 看文档 )。而且,还提供了管理管理应用菜单,本地化以及语言切换的基础设施,还包含了统一的Javascript API来简化显示系统的信息和通知。
ABP自动处理服务端的异常,并给客户端返回一个合适的响应。
ABP通过 Castle Windsor 使用并支持依赖注入,也使用了Log4Net来记录服务端的日志,然而,通过使用Castle的日志设备无需改变代码就可以切换到其他的日志库。
ABP平衡了一些最好的框架或者类库,除此之外,ABP自己的类和系统也提供了一个很好的用于N层架构Web应用构建的基础设施,也提供了很轻松地创建分层的解决方案的 模板 ,用作应用的起点。