企业对外提供服务,通常借助于软件应用。比如交易零售系统,用来提供购买商品的服务,这里就涉及到交易数据,这些数据会被用户“反复”的产生、查看,而且随着服务时间增长,应用本身也会面临困难
架构是一种主观上的东西,是对系统设计的一些可共享的“主观理解”,可共享性表现在系统中主要的组成部分以及他们之间的交互关系。对架构的定义能够统一的内容有两点:
模式描述了一个在我们周围不断重复发生的问题以及该问题解决方案的核心,这样能够一次又一次的使用该方案而不用做重复的劳动
层次模型致力于将企业应用组织成不同的层次,并协调各层次之间的关系
这里的层次是逻辑上的,不一定是物理上的隔离,所有层可以在1个服务器上,也可以是多个物理机
有三种组织形式 事务脚本、领域模型、表模块。
他们之间并不互相排斥,可以在事务脚本中处理部分领域逻辑,同时使用表模块或者领域模型来处理剩下的部分
使用过程来组织业务逻辑,每个过程处理来自表现层的单个请求。简单的来说就是从表示层获得输入、进行校验和计算处理、将数据存储到数据库中以及调用其它系统的操作等等
合并了行为和数据的领域的对象模型(每个类都有行为和数据,类之间交互来完成任务)。简单来说就是每个对象都承担一部分相关逻辑
处理某一数据库表或视图中所有行的业务逻辑的实例,它处于领域模型和事务脚本的中间地带
案例:对于一个给定的合同,不同的产品种类有不同的收入确认算法,需要计算给定合同的收入
事务脚本与领域模型的区别:
表模块与领域模型的区别:
独立出一个服务层放在领域模型与表模型之上,服务层本身有3种形式
可以在有要的时候才加服务层,如果加了也要最小化
以数据库的表结构为基础,每张表对应一个类,这种类为数据库访问提供了’入口‘。
应用程序其它部分就不需要关心SQL
入口使用方法有两种
在简单的领域模型中,模型本身和表相当一致,这时可以让领域对象本身去负责数据库的存储过程(也称作活动记录),它实际就是以行数据入口开始,把领域逻辑加入到类中,但是当领域模型复杂时,入口可以解决一些问题,但是这其实是让数据库方案和领域方案冗余在一起,导致部分入口域和领域对象域的转换,使得领域对象变得复杂,这时可以使用数据映射器,它来处理数据库和领域模型之间的所有存取操作,并且允许二者独立变化,使二者完全独立
使用活动记录能够解决简单的读取和存储操作,但是涉及到读取同时修改再存储等复杂操作,必须保证数据库的一致性,这种情况就可以工作单元解决。
工作单元用来充当数据库映射的控制器,它会跟踪所有从数据库读取对象以及任何形式修改对象,同时也负责重新提价到数据库。
简单的情况是由领域自己来完成,复杂情况则是交给了工作单元来做
表结构之前一般存在着 一对多,多对多这种结构,对象也需要处理好这种映射关系,方法则是在对象中使用一个标识域来保持对象之间的关系特性,并通过查找这些值来保持对象引用与关系键之间的映射。
并不是所有的关系都需要外键与关系域这种映射,如果值对象很小,可以使用序列化的方式直接存储到关联对象的一列中
对象本身存在继承关系,这个时候将这种结构映射到表中通常有以下三种方式:
类表继承通常需要多个连接,损失了性能;具体表该表很麻烦,一旦父类变更,所有的表都得改动;单表存在着空间浪费,单表过大也影响性能,但是修改容易而且不用连接
根据应用场景选择具体方式
模板视图:在网页结构中编写表现层,并允许在网页中嵌入标签,用以指明网页中的动态内容需要导向哪里,比如JSP 转换视图:将领域层返回的数据转换到表现成对应的结构位置上,比如根据后端的json数据反映到对应的样式表单