N层架构
介绍
应用程序代码库的分层架构是被广泛认可的可以减少程序复杂度、提高代码复用率的技术。为了实现分层架构,ABP遵循领域驱动设计的原则。在领域驱动设计中有四个基本层:
- 表现层:提供用户接口。使用应用层实现用户交互。
- 应用层:桥接表现层和领域层。协调业务对象来执行特定的应用任务。
- 领域层:包括业务对象以及业务规则。此层是整个应用的核心。
- 基础设施层:提供通用的技术能力来支持高层。基础设施层可以是使用ORM框架与数据库进行交互的一个仓储实现,或者是一个发送邮件的邮件提供者的实现。
可能还会有按需添加的额外的层,如下:
- 分布式服务层:将应用程序的特征暴露给远程客户端。像ASP.NET Web API、WCF这样的工具可以实现本层。
这些就是以领域驱动为中心架构的所有通用层。基于不用的实现可能会有微小的差别。
ASP.NET Boilerplate 架构
层级结构如下所示:
下面一个简单的分层应用,一个有5个工程的解决方案:
一个层可以有一个或多个程序集实现。对于大工程,最好为第三方依赖(如EntityFramework)创建多个项目。而且,可以有限界上下文,在这里每个上下文都有它自己的层。
领域层
所有的业务规则都应在领域层实现。
实体展现业务领域的数据和操作,通常来说实体会映射到实际的数据库表。
仓储是收集对象的地方,用来提取或持久化数据源(如数据库)上的实体。领域层定义仓储但是没有实现。他们在基础设施层实现。
领域事件用来定义特定的领域事件同时触发并处理他们。领域服务使用实体(和其他的领域对象)工作用来实现不属于一个实体的业务规则。
工作单元是一个设计模式用来管理数据库连接和事务,跟踪实体变化并且保存改变到数据存储区。它定义在领域层,在基础设施层实现。
此层应该尽可能的独立于第三方类库。
应用层
应用层包含应用服务,应用服务被展示层使用。应用服务方法可以接收DTO(数据传输对象)作为输入,执行一些特定的领域层操作,如果需要,也可以返回另一个DTO。应用服务方法不应直接接收或返回实体。应用服务方法通常被认为是一个工作单元。用户输入验证也在本层实现。建议使用工具类映射实体到DTO对象,如AutoMapper类库。我们也在本层建立会话,并获取当前用户信息。
基础设施层
领域层创建仓储、工作单元和其他服务的接口,基础设施层则实现这些接口。使用ORM工具如NHibernate或EntityFramework来实现仓库。APS.NET Boilerplate提供基础类来协作这两个ORM框架。基础设施层用来把其他层把对第三方库的依赖抽象出来。数据库迁移也可以在本层使用。
除了数据库访问,还有对服务提供者的抽象。例如,可以有一个发送SMS消息的提供者。可以在领域层或应用层定义一个接口以便从我们的代码中抽象出来,然后我们可以在基础设施层实现这个接口。
网络、展示层
网络层使用ASP.NET MVC、Web API和ASP.NET Core实现。有两种不同的方法可以在这里实现:单页面应用和多页面应用。启动模板里支持这两种方式。
在单页面应用里,所有的资源都是一次(或者核心资源加载,其他资源是懒加载的)加载到客户端的,其他的子请求都是用过AJAX调用实现的。客户端使用从服务器接收的数据生成HTML代码。整个页面从不会刷新,视图根据需要换入或换出。有很多的Javascript SPA框架,如Angularjs,Backbonejs和Emberjs。ASP.NET Boierplate 可以和任何一个协作,但是ABP提供了例子和一些帮助机制能够更加容易的和Angular协作。
在多页面应用里,客户端创建请求到服务端,服务端代码(通常是ASP.NET MVC 控制器)从数据库获取数据,Razor视图生成HTML。这些生成的页面返回给客户端显示。每一个新的页面请求都会导致整个页面刷新。客户端可以创建额外的AJAX请求以便有更好的用户体验。
SPA和MPA包含完全不同的架构。管理面板适合SPA,博客MPA更合适,因为博客希望被搜索引擎搜索到。有工具可以是SPA应用对搜索引擎可见, 通常的做法是这样的。
SignalR是从服务端推送消息到客户端的完美工具。它可以实现一个丰富的、即时的用户体验。
客户端有许多的Javascript类库和框架。在数千万的免费插件中,jQuery是最流行的。同样有工具或类库可以更好的使用HTML和CSS。例如Twitter Bootstrap就是一个非常流行HTML/CSS框架。
ABP提供了基础设施能够从应用服务创建Web API层,并且很容易使用JavaScript访问(参见文档)。另外,提供了管理应用菜单、本地化和语言切换的基础设施,还包含一个简单、统一的Javascript API简化显示系统消息和通知。
ASP.NET Boilerplate自动在服务端处理异常并返回客户端一个前档的响应。
其他
ASP.NET通过Castle Windsor框架使用和支持依赖注入。使用Log4Net记录服务端的日志,在castle抽象日志设施的帮助下可以在不改变代码的情况下轻松更换为其他日志记录类库。
总结
ASP.NET Boilerplate除了利用它自己的类库和系统外还使用了其他一些最好的框架/类库提供了一个创建N层架构应用的伟大基础设施。它还有可以轻松创建分层解决方案的模板,以此可以作为我们应用的起点。