[Architecture Design] CLK Architecture
CLK.Prototype.Architecture
最近找数据,看到了博客园在不久之前,办了一个架构分享的活动:.Net项目分层与文件夹结构大全。看完之后觉得获益良多,接着也忍不住手痒,开始整理属于自己的分层架构:「CLK Architecture」。
CLK Architecture的设计,是以DDD(Domain-driven design)概念精神做为核心,并且选用微软.NET相关技术来实作。期望提供开发人员,在开发.NET相关应用程序时,有个基础的分层架构、命名惯例可以参考,省去每个项目都要重新思考设计的脑力消耗。另外CLK Architecture也做为开发技术的索引地图,在每个不同的分层中,推荐可选用的各种技术框架,用以降低整个系统开发的评估成本。
Architecture Diagram
在CLK Architecture中,有几个要点需要先做说明:
- CLK Architecture是一个Layer层级的架构设计,系统会由零到多个Layer来组合成为一个完整的Tier。
- CLK Architecture里的每个Layer,是概念上的功能分层,实作时会包含零到多个功能模块。
- CLK Architecture里Layer包含的每个区块,是概念上的功能模块,实作时会包含零到多个程序项目。
Domain Layer
Domain Layer封装提供企业逻辑的领域对象、以及领域对象进出系统的边界接口。
在DDD(Domain-driven design)的概念精神里,系统中的企业逻辑可以被捕捉并且描绘出领域模型,再由领域模型去分析设计出对应的领域对象,用以在计算机系统中提供解决方案。而计算机系统中所执行的的领域对象,免不了需要将数据存放到数据库、或是从系统外部取得数据,这些与数据库、系统外部交换数据的功能,会被分析设计为对应的边界对象,然后再套用IoC模式来产生边界接口,用以切割领域对象与边界对象的相依。在CLK Architecture中这些领域对象(Entity、ValueO bject...)、边界界面(IRepository、IFactory...),会被分门别类、封装成为Domain Layer的内容。
DomainModel
对于领域模型、领域对象的捕捉与设计,有兴趣的开发人员可以参考下列数据:
Data Access Layer
Data Access Layer封装领域对象进出系统的边界对象。
在DDD(Domain-driven design)的概念精神里,系统中的领域对象与数据库、系统外部交换数据的功能,会被分析设计为对应的边界对象,然后再套用IoC模式来产生边界接口,用以切割领域对象与边界对象的相依。在CLK Architecture中这些边界对象(Repository、Factory...),会被分门别类、封装成为Data Access Layer的内容。
Persistence
Persistence用来封装系统与数据库交换数据的边界对象,这些边界对象实作透过IoC模式所产生的边界接口,用以提供领域对象进出数据库的功能。
在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的命名惯例)
- WPF (WinApp)
- ASP.NET (WebSite)
- ASP.NET MVC (WebSite)
- Windows Service (WinService)
- Windows Console (WinConsole)
- Windows Phone App (WinPhoneApp)
- Windows Store App (WinStoreApp)
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
提供系统展示的功能模块。在系统开发的各个阶段都会需要产生一些展示项目,用来验证功能模块是否符合需求。
[Architecture Design] CLK Architecture的更多相关文章
- [Architecture Design] 累进式Domain Layer
[Architecture Design] 累进式Domain Layer 前言 本篇的内容大幅度的简化了分析设计.面向对象等等相关知识,用以传达累进式Domain Layer的核心概念.实际开发软件 ...
- [Architecture Design] 跨平台架构设计
[Architecture Design] 跨平台架构设计 跨越平台 Productivity Future Vision 2011 在开始谈跨平台架构设计之前,请大家先看看上面这段影片,影片内容是微 ...
- [Architecture Design] 3-Layer基础架构
[Architecture Design] 3-Layer基础架构 三层式体系结构 只要是软件从业人员,不管是不是本科系出身的,相信对于三层式体系结构一定都不陌生.在三层式体系结构中,将软件开发所产出 ...
- Architecture Design Process
Architecture Design Process The architecture design process focuses on the decomposition of a system ...
- .NET Best Practices: Architecture & Design Patterns (5 Days Training)
.NET Best Practices: Architecture & Design Patterns (5 Days Training) .NET最佳实践:架构及设计模式 5天培训课程 课程 ...
- Agile software architecture design document style..( sketches and no UMLs)
http://www.infoq.com/articles/agile-software-architecture-sketches-NoUML If you're working in an agi ...
- [Module] 03 - Software Design and Architecture
本篇涉及内容: ORM框架(无需再用contentprovider或者sqlitedatebasehelper之类的古董工具了) 规划各种业务Bean文件(配合ORM框架) 设计一个好的请求基类(Ba ...
- Cloud Design Patterns & Architecture Styles
Cloud Design Patterns Categories Data Management Design and Implementation Messaging Patterns Ambass ...
- ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
1. 摘要 最近,神经网络的架构设计都是基于计算复杂度的间接度量,比如 FLOPs.然而,直接的度量比如运行速度,其实也会依赖于内存访问和平台特性等其它因素. 因此本文建议直接在目标平台上用直接度量进 ...
随机推荐
- How to Debug Enterprise Portal Code in Dynamics AX 2009
转载 To set up debugging for pages1. Log into the server that is running the AOS.2. Open the Microsoft ...
- an introduction to conditional random fields
1.Structured prediction methods are essentially a combination of classification and graphical modeli ...
- Could not get BatchedBridge, make sure your bundle is packaged correctly
react-native 运行android项目的时候运行成功但是模拟器上会提示: Could not get BatchedBridge, make sure your bundle is pack ...
- jsp中如何整合CKEditor+CKFinder实现文件上传
最近笔者做了一个新闻发布平台,放弃了之前的FCKEditor编辑器,使用了CKEditor+CKFinder,虽然免费的CKFinder是Demo版本,但是功能完整,而且用户都是比较集中精神发新闻的人 ...
- 【Software Clone】2014-IEEE-Towards a Big Data Curated Benchmark of Inter-Project Code Clones
Abstract 大数据的克隆检测和搜索算法已经作为嵌入在应用中的一部分. 本文推出一个代码检测基准.包含一些已知的真假克隆代码.其中包括600万条真克隆(包含type-1,type-2,type-3 ...
- Android JNI开发生成.h头文件问题
在JNI开发中,首先要将建立的anroid类编译成.h文件,编译用到命令javah,由于第一次用,以前对java的编译过程也不怎么了解,所以走了好多弯路,网络没有对这一步的详细介绍,这里讲一下: 通过 ...
- 聊聊 if else 那些事
从这周起,公司技术部每周五组织一次内部的技术分享,日常工作中,发现大家对if掌握的不是很好,今天先来聊聊if. 一.场景 简历的价格是根据专业的父Id设定的,下面根据简历Id获取简历的价格. /// ...
- outlook无法创建保存附件解决
用outlook2003收发邮件时,当打开或另存附件时提示“无法创建和保存文件” 解决 开始-运行,输入“regedit”打开注册表,打开以下键值“HKEY_CURRENT_USER\software ...
- Adroid学习系列-入门(1)
1. 安装 安装Eclipse,安装Adroid插件.安装Adroid SDK. 2. 项目目录说明 2.1. 建立Adroid项目 与一般的Java项目一样 )src文件夹是项目的所 ...
- 编写高质量JS代码的68个有效方法(四)
[20141129]编写高质量JS代码的68个有效方法(四) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...