DDD领域模型

  官方说法

  领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略和类型划分。领域模型是领域驱动的核心 ,采用DDD的设计思想,业务逻辑不再集中在几个大型的类上,而是在大量相对小的领域对象上,这些类具有自己的状态和行为,每个类都是完成的独立的,并与现实领域的业务对象形成一种映射。基于DDD的架构设计,保证了系统的可维护性,扩展性和敏捷性,在处理复杂业务逻辑方面有着明显的优势!

  以上是官方的说法:http://www.jdon.com/ddd.html

  个人理解

  传统的软件生产过程:分析,设计,编程,测试,部署。然而在真实的环境中,分析和设计时分开的,分析人员不需要了解设计,只需要知道设计-实现难度即可,而设计人员在接到分析的需求后,并不能很好的理解需求。而DDD就是抛弃了这种做法,在分析阶段,就将设计加入其中,给分析人员提出了更高的要求。

  DDD的弊端也十分明显,如果需求出现大范围改动,整个模型可能不再适合,这个时候吗,需要重新设计模型。给后期的维护带来更大的麻烦。 这也是

  DDD革命性在于:领域模型准确反映了业务语言,而传统的分层架构只关心数据, 这些数据对象除了简单读、写操作外,没有任何业务方法,被比喻成失血模型,那么领域模型这种带有业务方法的充血模型到底好在哪里?

  看到领域模型代码,就看到业务需求,没有翻译没有转换,保证软件真正实现“拷贝不走样”。

  DDD最大的好处是:接触到需求第一步就是考虑领域模型,而不是将其切割成数据和行为,然后数据用数据库实现, 行为使用服务实现,最后造成需求的首肢分离。DDD让你首先考虑的是业务语言,而不是数据。重点不同导致编程世界观不同。

  DDD的特点

  分层架构

  成熟、清晰的分层架构。

  领域对象与世界的业务映射。

  明确的职责划分。

  复用性

  领域对象是核心

  领域对象完美的描述了业务。

  设计基于领域对象,而不是数据库。

  适用对象

  具备复杂的业务逻辑的如软件

  对设计和开发人员要较高

  不适用普通的CRUD操作

  系统维护性和扩展性高

  DDD 的分层

  一般的系统设计是,一般分为三层:数据层,业务层,表现层,即MVC模式。

  DDD分层的方式发生了变化分成了:表现层,应用层,领域层,基础层。

  表现层也就是view层,这个无论怎么设计都不会丢。

  应用层:用来协助应用活动,不包含业务逻辑,不保存对象,只保存任务状态,相当于一个任务流。

  领域层:包含领域信息,包含绝大部分的业务,保留业务对象的状态,需要将业务对象交给持久化处理。

  基础层:可以理解为持久化,

  DDD中的几个核心对象

  Entites:包含业务逻辑的实体(domain)

  Factories:工厂类,用来生成对象

  Respositories:持久化,本身就是DAO

  Service:服务层,为Controller提供接口,负责领域对象的再次封装和业务流处理。

  模型中的Model

  在DDD模型中,一般分为三种模型,ViewModel,DomainModel,Model。

  ViewModel与UI数据对应

  DomainMode与领域业务模型对应,与业务关联。

  Model实体模型,与数据表对应。

  失血、贫血、充血、胀血模型

  失血模型:只有getter/setter方法,没有任何业务逻辑,也不包含任何的实体关系。

  优点:思路清晰,编写代码方便,所有业务都在service中。

  缺点:service过重,业务中出现大概率重复调用的情况。

  贫血模型:在这里Entity应该叫domain。简单来说,就是除了getter/setter方法外,兼任了组装实体的业务,并且保留实体之间的关系,或者说是实体之前的嵌套。依然是service–DAO–domain(entity)的层级关系。

  优点:各层级单向依赖,结构清楚,很容易编写,也容易维护。稳定。

  缺点:domain部分流转被封到了Service层,不够面向对象。Service也比较厚重。

  充血对象:充血模型是将DAO也挪到domain中,由domain去持久化对象。调用关系变成了service–domain–DAO。

  优点:很面向对象。Service很薄,

  缺点:DAO和domain双向依赖,存在很多问题。划分domain和service业务混杂,不同人员有不同理解。Service也需要调用domain的业务方法,相当于又封装了业务。

  胀血对象:取消Service层,只保留domain–DAO。

  优点:简化分层

  缺点:业务暴露太多给Web层。service的业务也被强行加入了domain,可能引发domain不稳定。

  四种模型中,失血和胀血模型,不应该被提倡,因为弊大于利。而贫血,充血这两种在技术上已经很成熟了。但是推荐使用贫血模型。因为充血模型中,DAO和domain双向依赖带来结构问题。而且在批量操作domain的结构,很不合理。推荐使用贫血模型,增加少量的业务在entity中。比如参数构造,getter/setter中加入少量的逻辑判断。编码优先级最高的是完成业务的同时,引起的BUG更少。至于是不是面

DDD领域模型和充血对象的更多相关文章

  1. DDD中的值对象如何用NHibernate进行映射

    原文:DDD中的值对象如何用NHibernate进行映射 <component/>是NHibernate中一个有趣的特性,即是用来映射DDD(Data-Display-Debuger)概念 ...

  2. DDD领域模型数据访问之对象(十一)

    在工程DDD.Domain中文件夹ModelPermission新建类:BAS_Object public partial class BAS_Obejct:AggreateRoot { //仓储接口 ...

  3. DDD领域模型之分配权限(十三)

    权限分配和权限查找. 在DDD.Domain工程中新建:BAS_PermissionAssign类 public partial class BAS_PermissionAssgin:Aggreate ...

  4. DDD领域模型数据访问权限之权限(十二)

    实现权限的领域对象:BAS_Permission public partial class BAS_Permission:AggreateRoot { private IRepository<B ...

  5. DDD领域模型数据访问权限之用户权限(十)

    BAS_PRService岗位和角色服务: public class BAS_PRService { //岗位 private IRepository<BAS_Post> ireposit ...

  6. DDD领域模型数据访问权限(九)

    权限分为:数据权限和功能权限 数据权限: 查询提供附加表达式的支持: //提供附加表达式的支持 List<TAggreateRoot> GetByCondition(Expression& ...

  7. DDD领域模型查询方法实现(八)

    在DDD.Domain工程文件夹Repository下创建RequestPage类: public class RequestPage { public RequestPage(int pagesiz ...

  8. DDD领域模型实现依赖注入(六)

    添加下订单的值对象: public partial class CustomerInfo:ValueObject { /// <summary> /// 下订单的值对象 /// </ ...

  9. DDD领域模型企业级系统(一)

    领域模型的基本构造块: 1.实体(Entity):有业务生命周期,使用标识进行跟踪. 2.值对象(Value Object):无业务生命周期,用来描述实体. 3.服务(Service):无状态的行为类 ...

随机推荐

  1. 微信小程序-1

    微信小程序 (开发微信小程序基础:HTML+js+css) l  准备工作 工具安装 开发工具是由微信官方提供 项目的预览(校验环境) l  开发体验阶段 -         Hello world ...

  2. C++声明和定义

    目录 1 参考 2 概念 2.1 声明 2.2 定义 3 对比 3.1 声明但不是定义的情况 3.2 声明且是定义的情况 3.3 特殊情况 1. 参考 1. <C++程序设计语言>4.9 ...

  3. 提高php代码质量的36个技巧的摘录

    17.不要直接使用 $_SESSION 变量 简单例子: $_SESSION['username'] = $username; $username = $_SESSION['username'];   ...

  4. mysql在windows下命令行启动与关闭服务

    一.命令行关闭与启动服务的命令: 二.运行cmd的命令行程序时,必须以管理员身份运行.否则会出现如下提示: 三.mysql5.7版本的服务名一般默认为mysql57,因此如果使用服务名mysql,那么 ...

  5. centos6更改密码

    创建新用户 创建一个用户名为:zhangbiao [root@localhost ~]# adduser zhangbiao 为这个用户初始化密码,linux会判断密码复杂度,不过可以强行忽略: [r ...

  6. ArcGIS 10——版本编辑流程

    上一篇文章学习了ArcGIS有关版本机制实现的基本原理,本文结合ArcGIS的数据编辑知识来将版本编辑.协调.解决冲突.提交更改的整个过程加以说明. 同上篇文章一样,写作本文的初始意图是因为目前的项目 ...

  7. mysql B+Tree索引

    原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索 ...

  8. 03: Django Model数据库操作

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  9. 20145332 拓展:注入shellcode实验

    20145332卢鑫 拓展:注入shellcode实验 shellcode基础知识 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外, ...

  10. [noip模拟题]排队

    [问题描述] 小sin所在的班有n名同学,正准备排成一列纵队,但他们不想按身高从矮到高排,那样太单调,太没个性.他们希望恰好有k对同学是高的在前,矮的在后,其余都是矮的在前,高的在后.如当n=5,k= ...