[Architecture Design] CLK Architecture

CLK.Prototype.Architecture

最近找数据,看到了博客园在不久以前,办了一个架构分享的活动:.Net项目分层与文件夹结构大全。看完以后以为获益良多,接着也忍不住手痒,开始整理属于本身的分层架构:「CLK Architecture」。php

CLK Architecture的设计,是以DDD(Domain-driven design)概念精神作为核心,而且选用微软.NET相关技术来实做。指望提供开发人员,在开发.NET相关应用程序时,有个基础的分层架构、命名惯例能够参考,省去每一个项目都要从新思考设计的脑力消耗。另外CLK Architecture也作为开发技术的索引地图,在每一个不一样的分层中,推荐可选用的各类技术框架,用以下降整个系统开发的评估成本。html

Architecture Diagram

Architecture Diagram

在CLK Architecture中,有几个要点须要先作说明:git

  • CLK Architecture是一个Layer层级的架构设计,系统会由零到多个Layer来组合成为一个完整的Tier。
  • CLK Architecture里的每一个Layer,是概念上的功能分层,实做时会包含零到多个功能模块。
  • CLK Architecture里Layer包含的每一个区块,是概念上的功能模块,实做时会包含零到多个程序项目。

Domain Layer

Domain Layer封装提供企业逻辑的领域对象、以及领域对象进出系统的边界接口。github

在DDD(Domain-driven design)的概念精神里,系统中的企业逻辑能够被捕捉而且描绘出领域模型,再由领域模型去分析设计出对应的领域对象,用以在计算机系统中提供解决方案。而计算机系统中所执行的的领域对象,免不了须要将数据存放到数据库、或是从系统外部取得数据,这些与数据库、系统外部交换数据的功能,会被分析设计为对应的边界对象,而后再套用IoC模式来产生边界接口,用以切割领域对象与边界对象的相依。在CLK Architecture中这些领域对象(Entity、ValueO bject...)、边界界面(IRepository、IFactory...),会被分门别类、封装成为Domain Layer的内容。spring

DomainModel

对于领域模型、领域对象的捕捉与设计,有兴趣的开发人员能够参考下列数据:数据库

Data Access Layer

Data Access Layer封装领域对象进出系统的边界对象。apache

在DDD(Domain-driven design)的概念精神里,系统中的领域对象与数据库、系统外部交换数据的功能,会被分析设计为对应的边界对象,而后再套用IoC模式来产生边界接口,用以切割领域对象与边界对象的相依。在CLK Architecture中这些边界对象(Repository、Factory...),会被分门别类、封装成为Data Access Layer的内容。json

Persistence

Persistence用来封装系统与数据库交换数据的边界对象,这些边界对象实做透过IoC模式所产生的边界接口,用以提供领域对象进出数据库的功能。windows

在CLK Architecture中是采用领域对象来作为进出数据库的数据单位,而企业中比较常见的数据库是关系数据库,在领域对象与关系数据库之间存在着「阻抗不匹配」的问题,领域对象是没有办法直接进出关系数据库的。 开发人员能够选用下列O/R Mapping框架、或是人工创建O/R Mapping相关程序代码,来实做系统中领域对象进出数据库的功能。架构

Configuration

Persistence用来封装系统与Config文件交换数据的边界对象,这些边界对象实做透过IoC模式所产生的边界接口,用以提供存取Config文件的功能。

在系统中除了将数据存放到数据库以外,也经常会须要透过Config档的方式来存放一些设定数据,让布署程序的过程可以更加的便利。 开发人员能够选用下列框架、或是人工创建相关程序代码,来实做系统中存取Config文件的功能。

ProxyModel

ProxyModel用来封装系统与子系统交换数据的边界对象,这些边界对象实做透过IoC模式所产生的边界接口,用以提供存取子系统的功能。

在系统中除了将数据存放到数据库、Config文件以外,某些情景也会透过TCP、WCF、Web API、函式库引用...等等接口来与子系统交换数据,藉以重用子系统的功能。 开发人员能够套用Adapter、Proxy...等等模式来包装子系统,来实做系统中存取子系统的功能。

Interface Layer

Interface Layer封装与用户互动的用户接口对象、以及与远程系统互动的通信接口合约。

在DDD(Domain-driven design)的概念精神里,与用户互动的用户接口,会被分析设计为对应的用户接口对象。而在用户以外,系统也须要透过通信接口来提供功能给远程系统使用,这些与远程系统交换数据的通信接口,会被分析设计为提供通信功能的通信接口对象、以及提供通信描述的通信接口合约。在CLK Architecture中这些用户接口对象、通信接口合约,会被分门别类,封装成为Interface Layer的内容。

View

View用来封装系统与与用户互动的用户接口对象,这些用户接口对象会透过网站页面、应用程序窗体...等等方式,来接受用户的输入、而且数据呈现给用户。

关于用户接口的开发与设计,应该依照项目需求、人力配置来作选择,开发人员能够参考下列数据来学习:

ServiceModel

ServiceModel用来封装系统与远程系统交换数据的通信接口合约,这些通信接口合约依照选择的技术框架,会以不一样形式存在于系统之中。而通信接口合约若是是以程序代码的方式存在于系统之中,这些通信接口合约中所使用的各类数据传输对象(Data transfer object),也必须以程序代码的方式存在于系统,而且一样封装成为ServiceModel的内容。

下列说明几种以不一样形式存在的通信接口合约:

  • WCF的通信接口合约,是以程序代码的方式存在于系统。(WCF Contract)
  • Web Service的通信接口合约,是以XML的方式存在于系统。(WSDL)
  • 自定义通信(TCP、UDP)的通信接口合约,会以说明书的方式存在于系统之中、程序代码以外。(Word)

关于通信接口合约、数据传输对象的开发与设计,应该依照项目需求、人力配置来作选择,开发人员能够参考下列数据来学习:

Application Layer

Application Layer封装与用户互动的用户领域对象、以及与远程系统互动的通信接口对象。

在DDD(Domain-driven design)的概念精神里,系统中除了包含企业逻辑以外、也包含了提供用户接口使用的功能逻辑(例如:验证、受权、数据组合...等等),这些功能逻辑会被分析设计为对应的用户领域对象。而在用户接口以外提供给远程系统使用的通信接口,也会被分析设计为提供通信功能的通信接口对象、以及提供通信描述的通信接口合约。在CLK Architecture中这些用户领域对象、通信接口对象,会被分门别类,封装成为Application Layer的内容。

ViewModel

ViewModel用来封装提供用户接口功能逻辑的用户领域对象,这些用户领域对象实做用户接口对象所须要的功能逻辑,用以提供功能给用户接口对象使用。

在系统中的用户接口会提供验证身份、受权功能...等等功能给用户,这些功能不属于企业逻辑因此不会被封装成为领域对象,会被分析设计为用户领域对象。而在用户接口中经常须要的数据对象不是单一领域对象,须要由多个领域对象组合成的数据对象,这些数据对象、数据对象组合与分解也被划分在用户领域对象之中。

这边要特别说明的是,若是目标系统的企业逻辑是处理验证身份、受权功能的功能,那在目标系统中封装这些功能的对象,会被划分在领域对象之中。也就是说,一个封装功能的对象是属于领域对象、用户领域对象,应该依照是否为目标系统的企业逻辑来区分。

ApplicationModel

ApplicationModel用来封装系统与远程系统交换数据的通信接口对象,这些通信接口对象实做系统所包含的通信接口合约,用以提供功能给远程系统使用。

在系统中的通信接口会提供功能给远程系统使用,这些功能不属于企业逻辑因此不会被封装成为领域对象,会被分析设计为通信接口对象。而在通信接口中用来封装通信数据的数据传输对象(Data transfer object),会是由一个到多个领域对象来组合、或是分解为一个到多个领域对象,这些数据传输对象的组合与分解也被划分在用户领域对象之中。

Host Layer

Host Layer封装系统中生成与组合各个Layer的功能,而且以应用程序、网站、系统服务...等等方式来设计为宿主程序,用以执行以后在计算机系统中提供解决方案。

关于宿主程序的开发与设计,应该依照项目需求、人力配置来作选择,开发人员能够参考下列数据来学习。(括号内容为CLK Architecture的命名惯例)

Infrastructure Layer

Infrastructure Layer封装系统中共享的功能模块。

Dependency Injection

提供Dependency Injection的功能模块。开发人员能够选用下列框架、或是人工创建相关程序代码,来实做系统中Dependency Injection的功能。

O/R Mapping

提供O/R Mapping的功能模块。开发人员能够选用下列框架、或是人工创建相关程序代码,来实做系统中O/R Mapping的功能。

Logging

提供Logging的功能模块。开发人员能够选用下列框架、或是人工创建相关程序代码,来实做系统中Logging的功能。

Other Layer

Other Layer封装不属于在系统架构的设计范围,但倒是系统开发设计时,一定会创建的功能模块。

Tests

提供系统测试的功能模块。系统测试在近代软件开发中扮演的角色愈来愈重要,有兴趣的开发人员能够找寻相关数据来学习。

Sample

提供系统展现的功能模块。在系统开发的各个阶段都会须要产生一些展现项目,用来验证功能模块是否符合需求。

相关文章
相关标签/搜索