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

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

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

分层构架

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

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

传统的三层架构

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

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

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

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

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

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

领域驱动设计的分层

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

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

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

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

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

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



推荐阅读
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
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社区 版权所有