热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

领域驱动设计实践(一)的转载与分享

分层构架在分析领域驱动设计之前,我们需要先回顾以前的分层架构。“层”是一种体系结构模式,也是被广大软件从业人员用的最为广泛而且最为灵活的模式之一。其中最

分层构架

     在分析领域驱动设计之前,我们需要先回顾以前的分层架构。“层”是一种体系结构模式,也是被广大软件从业人员用的最为广泛而且最为灵活的模式之一。其中最为大家所熟知的就是三层架构,那分层是什么?为什么要分层?传统的三层架构就是:表现层、业务逻辑层和数据访问层;其实所谓的分层要达到的目的就是,将具有不同的职责的组件分离开来,组成一套层内部高聚合,层于层之间低耦合的软件系统,这就是分层的目的;

    在领域驱动设计的讨论同样也是建立在层模式的基础上的,但与传统的分层架构相比,它更注重领域架构和技术架构的分离。

传统的三层架构

我们所熟知的三层架构,自然就是有:表现层、业务逻辑层和数据访问层,我们用一个图来表示:

三层模式图      看图中的“基础构架层”,从实践的表现上来看,这部分内容可能就是一些帮助类,比如TextUtility之类。这些东西可以被其他各层所访问。而基于分层的概念,表现层只能跟业务逻辑层打交道,而业务逻辑层在数据持久化方面的操作,则依赖于数据访问层。表现层对数据访问层的内容一无所知。

     从领域驱动的角度来看,这种分层的方式有一定的弊端。首先,为各个层面提供服务的“基础结构层”的职责比价紊乱,它可以是纯粹的技术框架,也可以包含或处理一定的业务逻辑,这样一来,业务逻辑于“基础结构层”之间就会存在依赖关系;其次这种结构过分突出了“数据访问”的地位,把“数据访问”与“业务逻辑”放在了同等的位置,这就形成了现在我们的”数据驱动“的开发方式,对于软件我们的第一直觉就是:”这个数据表该如何设计!“

    在微软.net3.0开始,引进了EntityObject的概念,在习惯了DataTable操作的时代,EntityObject所带来的灵活性是无法相比的,但这暗示了一场软件设计的思想革命,即使是微软也要按照这种思想前行,这就是需要摆脱原来的”数据驱动“走向”领域驱动“开发的道路,在长久的数据驱动的操控下,仍然有大部分从业人员成天抱着数据库不放,应对软件需求时,”我要实现某个功能,我的数据库该如何设计呢?“。其实是我们把软的目的搞错了,软件研究的是如何使用计算机来解决实际(领域)问题,而不是去研究数据应该如何保存更合理,所以软件设计应该是”数据驱动“走向”领域驱动“,而领域驱动设计的实践经验正是为了设计和开发大型复杂的软件系统提供了实践指导。

      微软在领域驱动上的进步,从DataTable这一纯粹的数据组织形式,到EntityObject这一实体对象,微软带给我们的不仅仅是技术框架,更是一套面向领域的解决方案。

     .NET 4.0来了,随之而来的是实体框架(EntityFramework,简称“EF”),在本系列文章中,我将结合领域驱动设计的实践知识,来剖析EF的具体应用过程,当然,现在的EF还并不是那么完善,我也非常期待能够看到,今后微软能够继续发展和完善EF,使其成为微软领域驱动工具箱中的重要角色。

领域驱动设计的分层

    领域驱动设计将软件系统分为四层:基础构架层、领域层、应用层和表现层。与上述三层相比,数据访问层已经不在了,它被移动到了基础构架层。

DDD分层图基础结构图:该层专为其它各层提供技术框架支持。注意,这部分内容不会涉及任何业务知识。众所周知的数据访问的内容,也被放在了该层当中,应为数据的读写是业务无关的

领域层:包含了业务所涉及的领域对象(实体、值对象)、领域服务以及他们之间的关系。这部分内容的具体表现形式就是领域模型(Domain Model)。领域驱动设计提倡富领域模型、即尽量将业务逻辑归属到领域对象上,实在无法归属的部分则一领域服务的形式进行定义。

应用层:该层不包含任何领域逻辑,但它会对任务进行协调,并可以维护应用程序的状态,因此,它更注重流程性的东西。在某些领域驱动的实践中,也会将其称为”工作流层“。应用层是领域驱动中最争议的一个层次,也会很多对其职责感模糊不清。

表现层:这个好理解,跟三层里的表现层意思差不多,但请注意,”web服务“虽然是服务,但它是表现层的东西

从上图中可以看到,表现层于应用层之间是通过数据传输对象(DTO)进行交互的,数据传输对象是没有行为的POCO对象,他的目的只是为了对领域对象进行数据封装,实现层与层之间的数据传递。为何不能直接将领域对象用于数据传递?因为领域对象更注重领域对象,而DTO更注重数据,不仅如此,由于”富领域模型“的特点,这样做会直接将领域对象的行为暴露给表现层。



推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • JavaScript中属性节点的类型及应用
    本文深入探讨了JavaScript中属性节点的不同类型及其在实际开发中的应用,帮助开发者更好地理解和处理HTML元素的属性。通过具体的案例和代码示例,我们将详细解析如何操作这些属性节点。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 在 Swift 编程中,遇到错误提示“一元运算符 '!' 不能应用于 '()' 类型的操作数”,通常是因为尝试对没有返回值的方法或函数应用逻辑非运算符。本文将详细解释该错误的原因,并提供解决方案。 ... [详细]
author-avatar
初来乍到1231
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有