在现代软件工程中,多层架构是一种常见的设计模式,它通过将应用程序划分为多个层次来提高模块化和可维护性。本文将探讨多层架构的设计原则,以及如何利用子层集和数据模型的层次结构来构建高效的应用程序。
应用程序接口是程序与外部消费者集和外部数据源集交互的桥梁。外部消费者可以是数据的消费者或生产者,而外部数据源同样可以扮演这两种角色。为了构建多层架构,定义应用程序的边界是必要的。应用程序的上边界界定了应用程序的功能区域和外部消费者的区域,而下边界则界定了应用程序功能和外部数据源的区域。通过应用边界的概念,可以定义应用程序的接口。
应用程序的输入接口位于上边界,是应用程序功能与外部消费者交互的入口。输入接口的例子包括视觉界面(由一系列视觉表单组成)和数据传输接口(由一系列服务器端端点组成)。如果应用程序不与外部消费者交互,输入接口就是内部接口,由内部应用程序计划或一组计时器组成。
外部数据源可以分为本地数据源和远程数据源两种类型。应用程序可以直接与本地数据源交互,无需使用驱动程序和软件库。本地数据源的例子包括本地文件和本地网络中的共享文件,以及USB/COM/LPT端口。应用程序的输出接口位于下边界,是应用程序功能与远程数据源交互的入口。输出接口的元素包括客户端套接字、与Web服务交互的代理对象、数据库驱动程序和外部设备驱动程序。远程数据源的例子包括服务器和桌面数据库、FTP服务器、目录服务(LDAP、Active Directory)、电子邮件和文档存储系统。
多层应用程序架构可以表示为具有同质结构的层集。每一层由一组子层组成。一个多级应用程序由一组相互交互的多层应用程序组成。任何应用程序都可以表示为1层或多级应用程序,其中每一层都是一个多层应用程序。
多层架构基于每一层的同质结构和层之间的层次交互。应用层由层功能和层数据组成。层功能由操作和事件组成。层数据组织为一组数据模型。
应用层的同质性意味着任何一层的结构都是相同的子层集合,子层之间的交互模式也相同。层之间的交互层次结构如下:相邻层和同一层的子层之间的交互是单向的;层的数据模型之间的数据交换是双向的。
子层由子层API组成,该API可以从上层或子层访问,以及子层的内部功能。子层API由一组子层操作组成。
子层 | 命名空间/包 | 注释 |
---|---|---|
应用程序输入接口 | 视觉界面 | 视觉表单集合 |
数据传输接口 | 服务器端端点集合 | |
内部接口 | 内部应用程序计划,计时器集合 | |
外观层 | 外观子层 | [FacadeRoot].Facade.Forms 视觉界面事件处理器集合(对于有视觉界面的应用程序) |
逻辑子层 | [FacadeRoot].Logic.Internal.Services.PresentationLogicServices | 有视觉界面的应用程序的表示逻辑 |
数据访问子层 | [FacadeRoot].Logic.External.Services.PersistenceServices | 命令/查询操作 |
逻辑层 | 外观子层 | [LogicRoot].Facade.Handlers 应用程序逻辑 |
逻辑子层 | [LogicRoot].Logic.Internal.Services.DomainServices | 应用程序的领域逻辑 |
数据访问子层 | [LogicRoot].Logic.External.Services.PersistenceServices | 命令/查询操作 |
持久层 | 外观子层 | [PersistenceRoot].Facade.DataAccessObjects 外部数据访问对象 |
逻辑子层 | [PersistenceRoot].Logic.Internal.Services.InternalLogicServices | |
数据访问子层 | [PersistenceRoot].Logic.External.Data.PersistenceManagers | 当使用直接SQL查询时 |
[PersistenceRoot].Logic.External.Data.DatabaseContexts | 当使用ORM框架时 | |
[PersistenceRoot].Logic.External.Data.EntityManagers | 当使用ORM框架时 | |
[PersistenceRoot].Logic.External.Connections.DatabaseConnections |