领域驱动设计(DDD)技术分享

简介:

注:本文为技术讨论会上的内容要点摘录整理的,相关内容仅作参考。

1       “模型”的几个概念

下面这2个名词容易混淆:

Module---模块,通常按照功能来划分,比如按照业务功能来划分

Model --模型,它通常出现在下面几个概念中:

 

l  MVVM --Model+View+ViewModel

l  MVP  --Model+View+Presenter

l  MVC  --Model+View+Controller

 

所以常说的Model实际上包含了View Model,Domain Model(简称DM),Entity Model。

 

PS:上面说的MVVM,MVP,MVC都属于“表现层架构模式”。

 

2       Entity--实体模型

2.1     概念来源

Entity--实体,其实它是来自于数据库设计中的概念,通常完善的数据库设计过程包含下面3个阶段:

1,  概念模型设计---E-R,抽象层次最高

2,  实体模型设计---Entity

3,  物理模型设计----具体数据库系统上面的表、视图、存储过程设计

 

2.2     Entity和表架构的关系

2.2.1  映射的种类

Entity映射的种类,可以有

l  表,

l  视图,

l  存储过程,

l  甚至数据库函数。

 

MS EF 将自定义SQL语句映射成实体类?

2.2.2  自定义SQL语句

1,  不同于视图,不能在视图中设定查询参数,

2,  相当于是存储过程和视图的结合体。

 

2.2.3  多对多关系

Entity和表等是一个“多对多关系”。

原因?

如果直接映射全表的字段到Entity,相当于是执行

Select * form Table

查询,这种方式有损效率。

 

2.3     懒人效应

所有的ORM工具都只能作为“工具”,会促使“懒人效应”。

1,  从表反向生成实体类,导致不愿意根据业务需求灵活定义实体类。

2,  没有自定义的实体类,所以每次都使用“全表映射”的实体类。

 

因此导致我们用ORM框架做的项目查询效率没有手写SQL的项目高。

要解决这个问题,就得看ORM框架是否支持“按需查询”

 

PS:---Linq2Sql,MS EF,PDF.NET 就是这样的框架。

 

 

 

3       “数据”的变化

3.1     “持久化”概念:

数据的存储媒介:内存,磁盘等。由于内存的数据容易丢失,所以要写入磁盘等长久存储媒介,数据的这个处理过程就是持久化。

 

3.2     在各个模型层面的变化过程:

 

1,ViewModel--〉数据从DM到视图界面的过程;

2,Entity--〉数据从DM到数据库一个“持久化”过程。

 

ViewModel《--DM--》Entity

PS:有同学说这3个Model相互转换很麻烦,其实可以使用第三方工具来做,比如开源的AutoMapper。

 

传统三层:

UI--〉BLL--〉DAL

 

UI《-BLL〈--DAL

该模式的特点,是高度依赖于数据库设计,没有数据库无法开工。

 

 

4       DDD--领域驱动设计:

4.1     领域模型

DDD,着重强调:-领域模型

PS:以我们这次项目为原型做好的领域模型介绍。

 

4.2     DDD实践的关键步骤:

4.2.1  领域建模

 

UML是一种建模工具,画草图,文档,讨论组等。。。。

 

UML强调的主要功能是“沟通”,把UML工具作为沟通的重要工具。

 

4.2.2  聚合根

--领域下的所有的对象都从这个根对象衍生出来,那这个对象就是这个领域下面的聚合根

 

4.3     DDD分层

常见的方式按照约定,分为:

l  Presentation Layer--表现层,

l  Domain Layer--领域层,

l  Repository Layer--仓储层

 PS:Repository Layer不同于三层架构的DAL,其中最关键的就是“驱动方向”不同,在DDD中,是Domain Layer需要什麽,Repository Layer提供什麽;而在DAL中相反,不管BLL是否需要,先提供一堆DAL方法再说,没有“领域”的需求。

4.4     领域驱动开发模式的开发过程

1、分析业务需求。

2、设计领域对象模型

3、测试领域对象模型

4、设计业务处理类

5、设计Entity和ViewModel

6、测试业务处理类

7、设计表架构

8、开发用户界面

 

 

5       数据库查询最有损效率的地方

l  全表查询;

l  连表查询;

l  不合理的使用索引。

 

优化方式:

1,              避免全表查询;

2,              将常见的表数据缓存,化解连表查询为单表查询。

 

很多项目都是CRUD(增,删,改,查)。

 

 

6       附录

6.1     参考资源:

UML类图关系大全

http://www.cnblogs.com/riky/archive/2007/04/07/704298.html

 

 

“领域驱动开发”实例之旅(1)--不一样的开发模式

http://www.cnblogs.com/bluedoctor/archive/2011/06/24/2088392.html

 

 

使用View Model从表现层分离领域模型

http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html



 

     本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2012/12/07/2807036.html,如需转载请自行联系原作者


 

 

相关文章
|
微服务
微服务迁移模式之Martin Flower绞杀者模式
绞杀者模式(Strangler Pattern)是一种非常流行的从单体系统向微服务迁移的策略,其主张通过用新服务替换特定功能来将单体系统逐步转换为微服务,一旦新服务已经能够代替原有旧有功能,就将原有功能组件绞杀(即彻底停用)。
3284 1
微服务迁移模式之Martin Flower绞杀者模式
|
7月前
|
Kubernetes API Go
利用k8s client-go库创建CRD的informer的操作流程
以上步骤将创建一个针对特定 CRD 的 informer,该 informer 会触发相应的事件处理程序以便您对事件进行响应。这是一个高级的方案,需要对 Go 编程语言和 Kubernetes 内部机制有深入的了解。在应用之前,强烈建议深入了解 Kubernetes client-go 库以及其工作原理。
219 9
|
设计模式 架构师 Java
一文详谈领域驱动设计实践
本文作者结合在团队的实践过程,分享了自己对领域驱动设计的一些思考。
811 8
|
存储 Java 测试技术
迄今为止最完整的DDD实践
对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战。
23369 8
|
监控 Java 数据库
Spring Boot中的多租户架构实现
Spring Boot中的多租户架构实现
|
存储 安全 Java
深度长文解析SpringWebFlux响应式框架15个核心组件源码
以上是Spring WebFlux 框架核心组件的全部介绍了,希望可以帮助你全面深入的理解 WebFlux的原理,关注【威哥爱编程】,主页里可查看V哥每天更新的原创技术内容,让我们一起成长。
849 3
|
负载均衡 安全 vr&ar
【Unity渲染】一文看懂!Unity通用渲染管线URP介绍
Unity 的渲染管线包含内置渲染管线、SRP、URP和HDRP。自从Unity2019.3开始,Unity将轻量级渲染管线修改为了通用渲染管线,这是一种快速、可扩展的渲染管线,支持所有的移动设备,适用于 2D、3D、虚拟现实 (VR) 和增强现实 (AR) 项目。
|
XML JSON JavaScript
JsonRPC协议详解(协议介绍、请求示例、响应示例)
RPC(远程过程调用)是一种用于实现分布式系统中不同进程或不同计算机之间通信的技术。它允许我们像调用本地函数一样调用远程计算机上的函数,使得分布式系统的开发变得更加简单和高效。 JsonRPC是一种基于JSON(JavaScript Object Notation)的轻量级远程过程调用协议。与其他RPC协议相比,JsonRPC使用简单的文本格式进行通信,易于阅读和编写,广泛应用于Web服务和分布式系统中。
1916 0
|
架构师 Java 中间件
阿里内部从初级程序员到架构师学习路线+配套学习资源
阿里巴巴终于公开了从初级程序员到架构师的学习路线图,这里相对应的基本上就是从P5到P8的晋升体系!今天老师将会带着大家从初级程序员开始一点点分享整个晋升体系!

热门文章

最新文章