整洁架构,因为他像洋葱一样一层层包裹,所以又名洋葱架构,同心圆架构,提出者是Jeffrey Palermo。不同层次的同心圆,代表了应用软件的不同部分,从里到外分别是实体层,用例层,接口适配层,框架与驱动层。
洋葱架构正如洋葱是一层层拨开,外层紧紧依靠内层一样的道理。洋葱架构中,最重要的原则就是依赖原则,如图中箭头所示,外层代码依赖只能指向内圆,内圆不知道外圆的任何事情。越往里,依赖越低,代码级别也越高。外圆是战术实现机制,内圆的是战略核心策略。同时,各个层次表示了我们在设计过程中,应该分离的不同关注点。
从最重要的内核说起:
Entities(实体):这一层是洋葱架构的核心,封装的是企业业务规则,一个实体能是一个带有方法的对象,或者是一系列数据结构和函数,只要这个实体能够被不同的应用程序使用即可。
这个层次里包含了业务中最重要的模型信息,描述该领域模型有怎样的信息结构,有怎样业务动作。作为设计者,我们一定不希望我们业务核心被外部系统如何展现所影响,比如在增加翻页需求或者是安全需求的时候,这些实体是最不应该被改变的。没有任何具体的应用需要改变实体,只有业务需求的变化才能影响这个层次的代码。所以这个架构是以领域模型为中心,不是以数据为中心,而这也是为什么所有讲到微服务、DDD方法实践的时候会提到这个架构的原因。
Use Case(用例):这个层的软件包含应用指定的业务规则,它封装和实现系统的所有用例。这些用例会混合各种来自实体的各种数据流程,通过实现与用户相关的服务组合与编排,并且指导这些实体使用企业规则来完成用例的功能目标。
我们既不希望外部的变化会影响这个层次代码的变化,也不希望这个层次会影响内部实体模型的变化。
Interface Adapters(接口适配):这个层次隔离了系统内部与外界,主要用于将用例和实体中的数据转换为外部系统如数据库或Web使用的数据,同时也将外部数据格式转换为适用于内部用例与实体的格式。
这个层次可以通过网关与外部系统打交道,通过持久层实现与存储打交道,还可以包含一些GUI的MVC架构中表现视图 控制器都属于这个层,模型Model是从控制器传递到用例或从用例传递到视图的数据结构。
Frameworks and Drivers(框架及驱动):通过接口适配后,数据可以与外部系统进行打交道。而这一层代表的就是业务系统的外部,如系统框架、UI界面、数据库等这些与系统业务并无直接关系的实现细节。我们将这些实现细节放在外面以免它们对我们的业务规则造成影响伤害。
整洁架构,提醒我们在分析设计系统的时候,一定要分离系统的关注点,识别业务的核心模型,围绕模型进行系统设计,一层层向外扩展,每一层都只能依赖内层,内层对外层无感知。
网友评论