ddd

设计模式之美学习(九):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

穿精又带淫゛_ 提交于 2019-12-05 20:30:55
我们都知道,很多业务系统都是基于 MVC 三层架构来开发的。实际上,更确切点讲,这是一种基于贫血模型的 MVC 三层架构开发模式。 虽然这种开发模式已经成为标准的 Web 项目的开发模式,但它却违反了面向对象编程风格,是一种彻彻底底的面向过程的编程风格,因此而被有些人称为反模式( anti-pattern )。特别是 领域驱动设计 ( Domain Driven Design ,简称 DDD )盛行之后,这种基于贫血模型的传统的开发模式就更加被人诟病。而基于充血模型的 DDD 开发模式越来越被人提倡。 基于上面的描述,我们先搞清楚下面几个问题: 什么是贫血模型?什么是充血模型? 为什么说基于贫血模型的传统开发模式违反 OOP ? 基于贫血模型的传统开发模式既然违反 OOP ,那又为什么如此流行? 什么情况下我们应该考虑使用基于充血模型的 DDD 开发模式? 什么是基于贫血模型的传统开发模式? 对于大部分的后端开发工程师来说, MVC 三层架构都不会陌生。 MVC 三层架构中的 M 表示 Model , V 表示 View , C 表示 Controller 。它将整个项目分为三层:展示层、逻辑层、数据层。 MVC 三层开发架构是一个比较笼统的分层方式,落实到具体的开发层面,很多项目也并不会 100% 遵从 MVC 固定的分层方式,而是会根据具体的项目需求,做适当的调整。 比如

设计模式之美学习(九):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

本秂侑毒 提交于 2019-12-05 20:30:34
我们都知道,很多业务系统都是基于 MVC 三层架构来开发的。实际上,更确切点讲,这是一种基于贫血模型的 MVC 三层架构开发模式。 虽然这种开发模式已经成为标准的 Web 项目的开发模式,但它却违反了面向对象编程风格,是一种彻彻底底的面向过程的编程风格,因此而被有些人称为反模式( anti-pattern )。特别是 领域驱动设计 ( Domain Driven Design ,简称 DDD )盛行之后,这种基于贫血模型的传统的开发模式就更加被人诟病。而基于充血模型的 DDD 开发模式越来越被人提倡。 基于上面的描述,我们先搞清楚下面几个问题: 什么是贫血模型?什么是充血模型? 为什么说基于贫血模型的传统开发模式违反 OOP ? 基于贫血模型的传统开发模式既然违反 OOP ,那又为什么如此流行? 什么情况下我们应该考虑使用基于充血模型的 DDD 开发模式? 什么是基于贫血模型的传统开发模式? 对于大部分的后端开发工程师来说, MVC 三层架构都不会陌生。 MVC 三层架构中的 M 表示 Model , V 表示 View , C 表示 Controller 。它将整个项目分为三层:展示层、逻辑层、数据层。 MVC 三层开发架构是一个比较笼统的分层方式,落实到具体的开发层面,很多项目也并不会 100% 遵从 MVC 固定的分层方式,而是会根据具体的项目需求,做适当的调整。 比如

ddd

南笙酒味 提交于 2019-12-05 15:13:38
<!DOCTYPE html> < html> < head> < meta charset= "UTF-8 "> < title>Insert title here</ title> </ head> < body> < script> window. location. href = "https://www.cnblogs.com/jxnc/ " </ script> </ body> </ html> 来源: https://www.cnblogs.com/jxnc/p/11930213.html

商城导航条(css版)

﹥>﹥吖頭↗ 提交于 2019-12-05 01:50:00
n久之前代码存档。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>商城导航条(css版)</title> <style> .topmenu{ display: block; width: 220px; border: 2px solid #e4393c; margin: 0; padding: 0; } .toptitle{ height: 40px; line-height: 40px; text-align: left; font-size: 11pt; font-weight: bold; color: white; background:#e4393c; padding-left: 20px;; } .topmenu li{ height: 30px; line-height: 30px; font-size: 11pt; list-style-type: none; text-align: left; padding-left: 8px; z-index: 3; background-image: url("1.png"); background-repeat: no-repeat; background-position: right; } .topmenu li a{

DDD(九)--工厂

我的梦境 提交于 2019-12-04 14:41:02
1、引言 在针对复杂领域进行建模时,聚合、实体和值对象之间的依赖关系可能会变得十分复杂。在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实例化逻辑,我们可能需要加载其他相关对象,且可能为了保持其他对象的领域不变性增加了额外的业务逻辑,这样即打破了领域的单一责任原则,又增加了领域的复杂性。 那如何去创建复杂的领域对象呢?因为复杂的领域对象的生命周期可能需要协调才能进行创建。 这个时候,我们就可以引入创建类模式——工厂模式来帮忙,将对象的使用与创建分开,将对象的创建逻辑明确地封装到工厂对象中去。 2、工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 DDD中工厂的主要目标是隐藏对象的复杂创建逻辑;次要目标就是要清楚的表达对象实例化的意图。 而工厂模式是计模式中的创建类模式之一。借助工厂模式我们可以很好实现DDD中领域对象的创建。 而针对工厂模式的实现主要有四种方式: 简单工厂:简单实用,但违反开放封闭; 工厂方法:开放封闭,单一产品; 抽象工厂:开放封闭,多个产品; 反射工厂:可以最大限度的解耦。 这里就不多赘述了。 3、封装内部结构 当需要为聚合添加元素时

DDD相对论

試著忘記壹切 提交于 2019-12-03 23:50:06
1. DDD的目的是为了解决复杂领域问题,可以快速应对业务场景变化。但如果从广义复杂度的角度来讲,实际上只是将复杂度从实现阶段提前到了设计阶段,其负责度本身没有大的变化。 2. DDD应该使用充血模型,这点上已经几乎没有什么可以争论的了,需要强调的是,狭义的贫血模型或是充血模型,仅依赖于编程语言和编程范式,例如基于C#的语言特性所定义出的贫血模型就应该是一个仅包含属性且没有行为的类,这个类只是在C#语境下去描述领域对象的一种表现形式而已,同样的在C#语境下,我们是否可以定义一种广义的充血模型(即“贫血模型”+“服务”),来表述领域对象呢?我想答案是肯定的。 来源: https://www.cnblogs.com/dryobjects/p/11811911.html

DDD分层架构的三种模式

笑着哭i 提交于 2019-12-03 11:04:11
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识。 DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型。在正确实现的情况下,我们通过DDD完成的设计恰恰就是软件的工作方式。 UL(Ubiquitous Language,通用语言)是团队共享的语言,是DDD中最具威力的特性之一。不管你在团队中的角色如何,只要你是团队的一员,你都将使用UL。由于UL的重要性,所以需要让每个概念在各自的上下文中是清晰无歧义的,于是DDD在战略设计上提出了模式BC(Bounded Context,限界上下文)。UL和BC同时构成了DDD的两大支柱,并且它们是相辅相成的,即UL都有其确定的上下文含义,而BC中的每个概念都有唯一的含义。 一个业务领域划分成若干个BC,它们之间通过Context Map进行集成。BC是一个显式的边界,领域模型便存在于这个边界之内。领域模型是关于某个特定业务领域的软件模型。通常,领域模型通过对象模型来实现,这些对象同时包含了数据和行为,并且表达了准确的业务含义。 从广义上来讲,领域即是一个组织所做的事情以及其中所包含的一切,表示整个业务系统。由于“领域模型”包含了“领域”这个词,我们可能会认为应该为整个业务系统创建一个单一的、内聚的和全功能式的模型。然而

DDD, Anti Corruption layer, how-to?

匿名 (未验证) 提交于 2019-12-03 09:02:45
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: At the moment, we have to build an application which is based on a legacy one. Code for that old application should be thrown away and rewritten, but as it usually goes - instead of rewriting it, we need to base something new on it. Recently, we decided to go the DomainDrivenDesign path. So -- anti corruption layer could be a solution for our problems. As far as I understand, this way it should be possible to gradually rewrite the old application. But -- I can't find any good example. I would appreciate ANY information. 回答1: In my particular

In ES + CQRS + DDD, can a event not update any real domain state at all?

匿名 (未验证) 提交于 2019-12-03 08:48:34
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: Would it be ok to have events in the event stream that does not effect any aggregate in the domain state? Take for instance an event such as AllCompletedTodosPurged that does nothing more than change a read model with active todos by removing all completed todos. 回答1: No, it wouldn't be ok. A Domain event is generated when the aggregate state changes. If nothing changed, there is no domain event. You can use events outside the domain as well, but they wouldn't be part of the domain and obviously not part of the event stream. In your scenario

Validation with DDD in SOA application using IoC

匿名 (未验证) 提交于 2019-12-03 08:46:08
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: In my service facade layer, I have a service class with a method/operation that accepts a DTO (data contract) object. AutoMapper is used to map this DTO into an instance of my domain object to apply any changes. The request is passed onto my domain service which does the actual work. Here's what the method might look like: public EntityContract AddEntity(EntityContract requestContract) { var entity = Mapper.Map<EntityContract, Entity>(requestContract); var updatedEntity = Service.AddEntity(entity); var responseContract = Mapper.Map<Entity,