Domain driven design 领域驱动设计(DDD)陷阱

我是DDD的新手,希望了解您可能想分享的任何陷阱。稍后我将对其进行总结,让更多的新手阅读:) 谢谢 迄今为止的总结: 您的实体主要只承载数据,不包含业务逻辑 没有充分使用有界上下文 过分关注模式 关于这个主题也有一个很好的演示(视频)。最大的陷阱之一是,您最终会遇到一个所谓的问题,即您的实体主要只承载数据,不包含业务逻辑。当您在现有关系数据模型的基础上构建域模型,并将数据库中的每个表作为域模型中的实体时,通常会出现这种情况 当心 领域驱动设计的陷阱之一是在模型中引入模糊性。如文章所述: 模棱

Domain driven design 域事件的粒度应该如何?

我想知道域事件的粒度应该是多少 例如,我有一些简单的方法,比如在个人资料页面上更改名字、第二个名字和电子邮件地址。我应该有3个不同的域事件还是只有一个 通过粗粒度域事件,当我添加新功能时,我必须创建事件的新版本,因此我必须添加新的事件类型,或将事件版本存储在事件存储中。通过细粒度域事件,我没有这些问题,但我有太多的小类。您认为,在这种情况下,最佳做法是什么?很多类都有什么问题?真的,为什么这么多开发人员害怕有太多的类?您可以根据需要定义任意多的类 域事件表示域以某种方式发生了更改。它应包含所有相

Domain driven design DDD通用语言-代码中仅英文术语?

在代码中使用泛在语言是DDD的一个主要原则。在此szenario中,您有什么建议: 您可以为国际运营企业创建应用程序 企业总部位于德国等非英语国家 领域专家在描述领域时使用的是德语术语 这些德语术语通常有英语术语 领域专家在使用德语术语的英语对等词时相当含糊 你会在代码中使用德语术语吗?使用英语术语和词汇表似乎会造成一些沟通障碍 另一方面,在代码中通常只使用英语术语也有一些很好的理由,例如,在这里找到:面对同样的情况,我们的做法如下(德语): 在和领域专家交谈时,我们用德语创建了一个无处不在

Domain driven design CQRS/ES更新聚合命令

我目前正在替换应用程序的域层,但必须保留现有的MVVMUI。我们当然想要一个事件存储,但我正在努力解决当前CQRS实现的某些方面 我们有一些复杂的聚合,其中包含多个实体集合和键/值对动态属性。我们现有的UI有一个用于此聚合的大编辑屏幕,我不确定如何构造用于更新的命令 可能的解决办法: 1) 只需在ViewModel中获取聚合,对域模型执行更新,并随命令一起发送(var command=new SaveAggregateCommand(myAggregate);)。这感觉是错误的,因为如果跨序列化

Domain driven design 构成多个有界上下文的DDD

我想听听你对有界上下文集成的建议。 我有一个让我陷入困境的用例: 对于合同管理,我有一个有限的上下文。我可以将当事人(例如各种外部组织)添加到合同中。为各方选择其投资/贡献(例如:总投资的10%)。因此,合同管理有两个方面:一个是行政管理(添加一方,管理多个日期,…),另一个是财务管理(计划他们跨越多年的贡献,检查贡献消耗,…) 我有另一个预算的有界上下文。该环境负责组织层面的费用管理。示例:服务a将具有1000欧元的支出能力。我们可以计划一个预算,然后每个组织党可以消费,购买东西,他们的一部

Domain driven design DDD存储库和工厂

在我的应用程序中,有几个层。 本主题将重点介绍域和基础架构层 我在域层有存储库接口ClientRepositoryInterface。 我在基础架构层实现了这个接口ClientRepositoryImpl 但是,为了在其存在的周期中间重构对象,我需要工厂(RealEngQualCon工厂)。 调用存储库中的工厂。 埃里克·埃文斯的这本书被描述为一种正常的做法 但是这个工厂(ResonstructionClientFactory)应该位于哪里?在域还是在基础架构层 我认为在这个领域。。。 但是但是

Domain driven design DDD中的聚合根之间允许哪一级别的通信?

根据沃恩·弗农(vaughn vernon)在他关于敏捷的书中给出的例子,他将产品设计为一个集合,将BackLogItem设计为一个集合,通过Id引用产品AR 现在,我们需要在BackLogApplicationService中规划新的BackLogItem,如下所示: public class ProductBacklogItemService { //... public void planProductBacklogItem( S

Domain driven design 同一概念的不同模型

我有一个ERP项目与多个子域。它不使用CQR或域事件 我有两个子域;客户关系管理和会计。客户概念需要在两个子领域中进行不同的建模。CRM需要知道公司的规模(员工人数),但不需要知道税号。会计需要知道税号,但不需要知道规模。两个子域都需要公司名称 我正在考虑将CRM客户和会计客户都建模为实体。但是,每当CRM用户创建新客户时,也需要创建一个Accounting customer实例。如果报表需要来自这两个子域的信息,那么查询将比包含所有信息的单个实体更复杂 这是路吗?有更好的办法吗?在不使用域事件

Domain driven design DDD实体工厂责任

创建实例 我是DDD新手,不知道创建实体的工厂是否负责创建价值对象。以下是我目前所拥有的一个小例子: class User extends Entity { public name: UserName; constructor (name: UserName) { this.name = name; } } class UserName extends ValueObject { public userName: string; } clas

Domain driven design 命令accros使用CQR和ES进行多个聚合

我在考虑解决问题的办法时遇到了一个奇怪的情况 简要回顾一下:我正在使用一个事件存储和CQR,我有两个聚合,分别称为“组”和“用户” 基本上,用户定义了一些特征,比如他的地区、年龄和一些兴趣 然后,他可以选择与同一地区、年龄和兴趣相同的群体“匹配” 现在情况是这样的:“配对”部分应该完全发生在后端,这可能是一个长时间运行的过程,但对于客户端来说,只需对端点进行一次调用,最终结果应该是他与一个组匹配 所以对于这种情况,我必须查询具有相同区域、相同年龄段的组,兴趣在我的查询中并不重要。我知道我们有一个

Domain driven design 保护敏感实体数据

我正在寻找一些关于具有一些特性的客户机/服务器解决方案体系结构的建议 客户机是一个相当厚的客户机,服务器主要依赖于持久性、并发性和基础架构。 服务器包含许多实体,这些实体包含敏感信息和公共信息。例如,假设实体是个人,假设社会保险号码和姓名是敏感的,年龄是公开可见的 启动客户端时,用户会看到许多实体,不会透露任何敏感信息。用户可以随时选择登录并对服务器进行身份验证,如果身份验证成功,则授予用户访问敏感信息的权限 客户机正在托管一个域模型,我正在考虑将其实现为某种“延迟加载”,第一个请求实例化实体,

Domain driven design 域驱动设计-UI直接调用存储库

在域驱动设计中,是否有任何硬性规定UI层不应调用数据访问/存储库层?如果没有,那么它应该如何以正确的方式工作 感谢通常,您可以通过应用层控制器处理对数据访问层/存储库的调用,该控制器调用基础结构层中的数据访问 然而,在这条规则方面,以NHibernate闻名的Ayende有一些有趣的观点 通常,您将通过应用程序层控制器处理对数据访问层/存储库的调用,该控制器调用基础结构层中的数据访问 然而,在这条规则方面,以NHibernate闻名的Ayende有一些有趣的观点 有些人喜欢通过应用程序服务路由一

Domain driven design 使用标志交换存储库

我有一个IRepository接口,有许多T和几个实现(按需数据库、web服务等)。我使用AutoFac为许多T注册IRepository,具体取决于我希望为每个T注册的存储库类型 我还有一个基于.NET缓存的实现,它在缓存中查找T,然后调用“real”IRepository.Find来解决缓存丢失问题。它是这样构造的: new CachingRepository(realRepository, cacheImplementation); 我想使用一个配置标志来决定AutoFac提供的是基于缓

Domain driven design 如何结合DDD(域驱动设计)DCI设计应用程序

DDD是领域驱动的设计,它是一种包括普遍存在的语言、根实体、值对象和聚合的方法 DCI:数据、上下文、交互是Trygve Reenskagug发明的一种编程范式 如何在新系统中与它们结合?这是一个正在讨论的主题,您可能会在前面讨论过的对象组合Google group中找到更好的答案。此外,在DCI github页面上,还努力将规范DDD示例移植到DCI 长话短说:DCI适合于一个有限的上下文,在这个上下文中,每个用例都有一个DCI上下文 如果您通读本文,我相信DCI的“上下文”概念将是“流程管理

Domain driven design 贫血数据模型(ADM与RDM)

我试图理解ADM和RDM之间的区别 在我看来,adM和RDM的讨论都可以归结为您实际确定工作流程的地方(对象的协作)。RDM将数据存储库对象和验证对象注入到业务对象(模型)的构造函数中。然后,业务对象方法定义了使这些对象协作的工作流 ADM将所有这些协作对象(模型、存储库、验证对象)传递到viewModel/controller等。viewModel/controller的方法定义了对象之间的工作流协作 这是正确的还是我遗漏了一些更基本的东西?我假设RDM=富域模型。ADM和RDM(实际上是“真

Domain driven design 聚合根目录:状态更改或失败,出现异常或。。。?

聚合根用于控制状态更改-当前允许的和不允许的。如果允许状态转换,请继续。如果不允许,则抛出一个异常,解释不允许的原因 但是如果状态更改没有发生,因为它已经处于请求的状态,该怎么办 例如,如果在聚合根上有一个Approve方法,并且在调用该方法时,该状态已被批准 是否应抛出异常la“XYZ已被批准” 还是应该默默地忽略它 或者是否应再次“通知”状态更改(事件来源,下一段) 在我的例子中,我使用事件源,因此如果发生状态更改,将发出一个事件。在我的事件流中有没有真实状态更改的事件对我来说并不“干净

Domain driven design DDD:一个聚合根,多个持久数据源

在指南/电子书中,“设计基础设施持久性层”(第213页)一章中:(与相关)一般解释了聚合根如何对持久性数据源执行CUD操作 提到了两个重要的起点: 根据持久性忽略原则和基础设施忽略原则(第218页),聚合不知道持久性方法和基础设施。聚合由业务而不是基础结构决定 每个聚合根只能定义一个存储库,以保持聚合中对象之间的事务一致性(第213页) 不幸的是,在前面提到的所有其他示例中,聚合根及其下的所有底层对象都位于同一个持久数据源中 模式如下: 将创建一个包含该聚合的存储库 在这个存储库中,在创建过程中

Domain driven design 以简化的DDD/CQS模式读取模型/聚合代码组织,其中需要从其他域读取模型

首先,关于“简化的DDD/CQS模式”,我引用的是示例dotnet应用程序(它不是“严格的”DDD/CQS)。然而,我不是dotnet开发人员,我的问题与一般设计模式/代码组织有关 我个人的情况如下: 我拥有带有“会议”根聚合和“会议版”聚合的“会议”域。在RDBMS中,语言会议有许多版本。在这个领域,所有与外界的“交流”都是通过根聚合“会议”完成的。因此有一些用例,如Conference.create()、Conference.addDraftEdition()、Conference.publ

Domain driven design DDD数据层和表示层

您好,我有一个关于ddd层的问题: 我基本上是用以下方式组织我的文件夹: ├───presentations │ ├───controllers │ ├───helpers │ ├───protocols ├───modules │ ├───domain #interfaces of implemented command handler │ ├───commands #Commands interfaces & abstra

Domain driven design DDD:在聚合根目录中保留指向实体的链接,仅用于报告

我正在使用DDD重构一个项目,但我担心不要让太多的实体成为自己的聚合根 我有一个商店,它有一个产品选项s列表和一个产品s列表。一个ProductOption可由多个Products使用。这些实体似乎非常适合存储聚合 然后我有一个订单,它暂时使用产品来构建其订单行s: class Order { // ... public function addOrderLine(Product $product, $quantity) { $orderLine = new Or

Domain driven design 每个州一个命令,或者一个命令来管理所有州

我正在努力分析我正在处理的一个问题。我处理的是一个清洁应用程序,其中的清洁计划,然后由一些企业完成,最后由房屋所有者控制 当企业完成了自己的部分后,它必须向应用程序发送命令,告知: 这项工作是从开始日期到结束日期完成的 这项工作没有完成,完全是我们的错 工作未完成,但这是所有者的错误 每一个都可能使用不同的信息。所以我考虑使用3个不同的命令来建模,而不是只使用一个命令并添加一个状态 但还有一个层次的复杂性,因为企业可能会执行三种主要的清洁,对于每种清洁,您可能会在这些命令中添加不同的内容,例如:

Domain driven design 协会';横向

我正在阅读Eric Evans的《领域驱动设计》-《领域驱动设计》一书,第五章,关于关联。他的一个降低模型复杂性的建议是为关联施加一个遍历方向 我引述: 尽可能多地约束关系非常重要。A. 双向关联意味着两个对象都可以理解 只有在一起。当应用程序需求不需要遍历时 在两个方向上,添加遍历方向会减少 相互依赖并简化了设计。了解领域 可能会显示出自然的方向偏差 如何为关联选择遍历方向?通常,当两个元素之间存在关联时,可以在两个方向上读取和理解该关联。是什么导致我们选择一个方向而不是另一个方向 谢谢当实体

Domain driven design 将对非根实体的引用传递给外部对象几乎没有什么令人困惑的地方

根实体可以将对内部实体的瞬时引用传递给外部对象,但前提是操作完成后外部对象不保留该引用 (一) a) 为什么外部对象在单个操作期间具有引用(对内部实体的引用)是可以接受的,但在两个操作期间保持该引用是不可接受的?我的观点是,如果在两个操作的持续时间内保持引用是不好的,那么在一个操作的持续时间内保持引用可能同样是不好的 b) 假设SomeRootEntAggregate root将内部实体SomeIntEnt的瞬时引用传递给外部对象,那么外部对象应该如何请求SomeIntEnt?通过在根上调用特定

Domain driven design 用于创建骨料的工厂应放置在何处?

我们可以将工厂放在聚合根上,放在与生成另一个对象密切相关的对象上,也可以将其实现为服务(通常创建整个聚合) a) 在大多数情况下,创建聚合根的工厂应该放在哪里(假设只创建根而不是整个聚合是合理的)?根本身 b) 同样,在大多数情况下,用于创建完整骨料的工厂应放置在何处 多谢各位 a) 在大多数情况下,创建聚合根的工厂应该放在哪里(假设只创建根而不是整个聚合是合理的)?根本身 当只创建聚合根对象本身有意义时,请提供工厂方法。在我看来,大多数时候,这只是一种静态的方便方法,用于分配内存和调用初始化例

Domain driven design DDD:继承和事务

我正在试验领域驱动的设计和事件来源。我计划使用(在C#中开发)NServiceBus、JOliver的EventStore和NES来绑定它们。我已经为一个简单的案例(仅一个聚合根和值对象)提供了基础结构 我正在阅读Evans blue book,并试图开发一个简单的领域模型,其中的示例取自我的工作领域(暖通空调维修公司的ERP和CRM) 我正在为一个简单的子领域建模,即HVAC机器及其之间的关系。机器有多种类型,如熔炉、燃烧器、空调、压缩机、通用部件。每台机器可以有多个子机器。所有机器类型共享一

Domain driven design 实体如何在域内相互连接?

假设有两个域实体: UserImages使用方法addNewImage(),removeImage($imageId),getImages($from,$count) UserProfile带有字段name、age、mainImageId等 域内需要以下功能:当应用程序层调用UserImages->addNewImage(),UserProfile->mainImageId为空时会自动设置 那么,实现域内实体业务逻辑的最佳方式和最佳位置是什么?使用观察服务、引用来自实体的特殊服务或其他方式的

Domain driven design 领域驱动设计中的服务

我正在创建一个应用程序来尝试DDD。 该应用程序用于租赁电影,我的课程是: class Movie{ String title String descrition } class Customer{ String username } class Rent{ Film film User user Period period } 就我所知,我还有一个RentService来创建Rent对象。因此,我: class RentServi

Domain driven design 如何在域层中使用外部值对象库

我希望有一个或多个基本上是值对象的可重用类库,例如Address、PhoneNumber、EmailAddress,其中大部分包含属性和一些支持方法。我的域层如何使用它们而不打破域层不应包含外部引用的规则,并且不将它们定义为域层中的接口/抽象类 。。。不违反域层不应包含外部引用的规则 我认为你对“外部参照”的定义需要重新评估。很难想象一个域层不引用任何内容。在C#和Java中,您将至少引用基本的数字类型、日期和字符串。我也不认为引用像Noda/Joda time这样的外部库有什么害处。另一方面,

Domain driven design 哪里可以找到领域驱动的设计顾问?

首先,我不知道这里是否是提出这类问题的地方,但由于我还没有确定合适的论坛和渠道,我将求助于这里的专家 我的问题是: 在工作中,我们目前正在计划调整我们的代码库,以遵守领域驱动设计(DDD)的原则,在这方面,我们已经考虑聘请DDD顾问来帮助我们起步 这里有人知道DDD顾问吗,或者去哪里找他们,如果没有的话 我们是一家总部设在丹麦的公司,理想的人选是来自丹麦的人,但如果他们愿意出差,也可以安排。因此,我们有一个专门为雇佣人员或被雇佣而设计的就业平台。我相信您或您的公司可以雇用具有所需个人资料的人员,

Domain driven design 使用一个实体和值对象创建聚合

我正在与实体和价值对象的概念作斗争。 我已经阅读了实体和值对象之间的差异,但我无法将知识转移到我的示例中 我想创建一个aggreagte零售商 零售商具有id、name、address Street、ZIP、Country和 GPS坐标纬度、经度 我的聚合根是实体零售商 这里的值对象是什么?实体的属性是什么? 地址是实体零售商的属性还是价值对象? GPS是价值对象本身还是价值对象地址的属性 什么是有效的组织方式?我添加了一个在我的项目中如何组织的示例。将地址添加到值对象而不是将其作为属性添加到实

Domain driven design 将来发生的域事件

一个有限的上下文是否应该负责为未来的事物引发事件 考虑一个人有一组工作的场景。一份工作可以在将来结束。域将在结束日期添加到作业时引发“JobEndScheduled”事件。域是否应该在作业实际结束时引发“JobEnded”事件 我很想得到社区对此的反馈,因为这一定是一个常见的问题。我在DDD的任何一本书中都看不到这方面的内容。我对答案有一个清晰的看法,但在这一点上我不想影响任何答案 非常感谢 注意:上周我问了一个类似的问题,但我太关注命名方面,而不是实际事件本身。我希望这个问题更清楚 考虑一个人

Domain driven design 同一聚合中的从属实体

情况: 我们有一个经典的Order,带有OrderLines。每个OrderLine都引用了ProductId 每个产品都有其相关产品。例如,产品 class Product { string Id; string Name; string RelatedProductId; decimal RelatedProductQuantity; . . . } 有一条业务规则,每当使用新的OrderLine将Product添加到Order中时,那么使用id=

Domain driven design 访问模型实体中模型服务的接口

我可以使用模型服务接口通过模型实体访问模型服务 我知道我们可以从模型服务访问实体,但反之亦然,尽管模型服务接口是可能的。。这当然比编写更多的过程性代码要好——使用实体而不是让它们自己工作 但我同意这一点: 我自己的经验法则是,当交互可以单向进行时,使用域事件(由Udi指定)作为IoC的首选方式。如果不行,我就用双重调度 但是双重分派是不同的,在这里,您将域对象传递到服务的实现中。我可以将IDomainService注入域对象的构造函数并调用该服务的方法吗

Domain driven design DDD与工厂

您好,我有一些关于领域驱动设计和使用工厂/工厂方法的问题。 根据领域驱动设计蓝皮书(Eric EVan的书),它指出复杂的构造函数应该封装在工厂/工厂方法/构建器中,因此有一个一致的地方可以检查所有不变量,所以我的问题是关于这一点: 比如说,我正在开发一个magic organizer应用程序,您可以在其中对魔术效果进行类似CRUD的操作(比如博客上的帖子+几个属性,比如效果持续时间、使用的材质(字符串列表)、与魔术效果相关联的模式),一些不变量是魔术效果必须始终有标题,魔术效果的内容、持续时间

Domain driven design 存储库方法还是聚合根方法?

我有一个名为Person的实体。它表示可以与其他人共享信息的人。我还定义了两个实体电话号码和地址,它们表示一些信息。每个人都可以在数据库中提供他们的电话号码和地址,例如电话号码和地址,并且提供的信息仅属于该人。然后,拥有特定信息电话号码和地址的人可以通过实体关联将这些信息电话号码和地址相互关联,并可以将此关联共享给其他人 我试图遵循领域驱动的设计方法。由于电话号码或地址只属于一个人,因此电话号码和地址的身份是该人身份的本地身份。因此,我认为有一个集合,包括实体个人,电话号码,地址和关联。聚合的根

Domain driven design 领域驱动设计(DDD)中的POCO

POCO类在域驱动设计中有行为,例如Validate()方法,是真的吗?是的,域驱动设计中的域模型类应该关注行为,如果这是您的意思的话。是-实体封装对象的数据和行为-因此它不再是一个普通的旧契约对象,而是一个域对象 一种思考方法是想象其他代码都看不到对象的属性,因此它们无法 if (myDomainObject.Name != null) ... 他们必须打电话 if (myDomainObject.IsValid()) ... 当您更改使其有效的规则时,只需在域对象中进行更改,因为您已阻止

Domain driven design 控制粒度的域服务

我认为域服务应该只表示域概念,但似乎我们也应该使用它们来控制域层接口的粒度(这也防止域知识泄漏到应用层),并将客户端与实体和价值对象分离: 埃里克·埃文的DDD书,第108页: 虽然这种模式讨论强调了 将概念建模为服务,该模式作为一种服务也很有价值 控制域接口粒度的方法 层,以及将客户端与实体和值分离 对象 中等粒度、无状态的服务更容易在大型应用程序中重用 系统,因为它们将重要功能封装在 简单的界面。细粒度域对象有助于 知识从领域泄漏到应用层,应用层 域对象的行为是协调的 a) 如果我们还引入了

Domain driven design 公开类似于存储库的方法的域实体

就拿这个例子来说。主管域类公开了一个方法 获取下属(DateTime from,DateTime to)将返回给定时间段内由给定主管监督的所有人员 出于令人愉快的语义原因,该方法应该放在这里。但是为了DDD纯度应该去别的地方。这是因为我假设要实现需要使用存储库的方法,而将存储库嵌入域实体中似乎是错误的。在这种情况下,该方法应该进行响应或服务-GetUnderlines(主管-主管,DateTime-from,DateTime-to) 其他人如何处理这种情况 编辑:我认为这些力量可以这样描述:根据

Domain driven design 聚合交叉边界上下文

我是ddd/cqrs/事件源初学者,我有一些概念上的问题 例如,我想实现一个简单的购物车,它必须有一个有限的上下文:admin和website。两者都将讨论同一个聚合:顺序 在这种情况下,我可以共享跨边界上下文吗?如果没有,在上面的示例中如何执行 干杯, Ron聚合根只属于一个有界上下文。您可以使用发布的语言(合同/命令)从其他BC与该聚合进行对话。您需要的是绘制上下文图,并确定哪个BC在上游,哪个BC在下游。这真的很重要 检查本文=>聚合根仅属于一个有界上下文。您可以使用发布的语言(合同/命令

Domain driven design CQRS查询端实现

我有点困惑在哪里实现应用程序的查询端,我有下一个体系结构: Product.UI.Web.Admin (MVC) Product.Application -CommandHandlers (e.g OrdersCommandHandler) -Commands (e.g CreateOrder) Product.Domain -Model (Behavior-rich models / repository interfaces) Product.Infrastructure (Base

Domain driven design 在DDD&;CQRS,正确设计具有多个聚合更新的同步读取模型

假设我有两个聚合Staff和Shop,我有一个读取模型StaffModel,在非规范化视图中包含店铺信息(shopId、名称、地址等) 业务规则是在一个请求中创建一个Staff和一个Shop,因此我有一个CreateStaffService,它创建一个Staff并激发StaffCreatedEvent,然后CreateShopService的侦听器,创建一个Shop,然后激发ShopCreatedEvent 在read model方面,我有4种设计同步器服务的方法: 订阅StaffCreated

Domain driven design 初始化域对象-观察实体、Tell、Don';不问

我试图遵循一些更为流行的设计原则,包括实体设计和领域驱动设计。我的问题是人们如何处理“初始化”域对象 下面是一个简单的例子: 基于SOLID,我不应该依赖于具体化,所以我创建了一个接口和一个类。因为我利用了领域驱动设计,所以我用相关的方法创建了一个对象。(即不贫血) 为了有助于测试和更松散地耦合,我还使用了一个IoC容器来创建这本书。因此,当创建书籍时,它总是被创建为空的。但是,如果一本书没有ISBN和库存,它是无效的 BookstoreBook(string bookISBN, int boo

Domain driven design DDD |层次结构(相同类型)|约束

我看了另外两个似乎相关的问题: 但是他们和我的情况不完全一样;可能缺少了“约束”方面 我的情况:我有一个AR名为“研究”,研究可以按集群组织(借鉴调查领域中的集群抽样概念) 假设这个“研究”在is构造函数中接受这个参数“clusteringDepth”(一个整数)。假设:我指定了3个(省、县、市) 这只是一个研究的规范。当您实际执行一项研究时,您将基于该研究创建一个StudyPlan实例 因此,在本例中,我将有一个StudyPlan实例,它有一个省份列表(一级集群)。每个省都有一个县列表

Domain driven design 域服务的名称

您有一个名为“服务”的域模型。在这种情况下,您将拥有名为“ServiceService”的域服务,这是一个容易混淆的名称 名称“服务”是否有其他选择?为什么需要在名称中添加“服务”?为什么只用“服务”来命名?通过命名,您应该了解该域服务的(单一)责任是什么。例如,您可以有一个GoodServicePayingCustomerFilter或InvoiceForServiceGenerator为什么需要在其名称中添加“服务”?为什么只用“服务”来命名?通过命名,您应该了解该域服务的(单一)责任是什么

Domain driven design DDD-乐观并发属性(etag或时间戳)是否应该成为域的一部分?

从理论上讲,如果我们在聚合根级别实现乐观并发(在AR中更改实体在AR上更改版本),并假设我们使用版本属性的时间戳(只是为了简单起见)——时间线应该是AR上的一个属性,还是应该是读取模型的一部分(例如,更新)作为应用程序服务的单独参数,如: [伪] public class AppService{ . . . public void UpdateSomething(UpdateModelDTO model, int timestamp) { repository.GetMo

Domain driven design DDD设计与HttpDelete

我不熟悉DDD设计概念,但我想在阅读相关文章时澄清一些事情。Jimmy Boggard使用以下词语: “聚合边界之外的任何内容都不能包含对内部任何内容的引用,根实体除外。”,“只有聚合根可以通过数据库查询直接获得。其他所有内容都必须通过遍历完成。” 假设我想删除一篇文章的评论。在这里,据我所知,post是root。因此,所有与评审的沟通都应该通过post对象进行。 这意味着我需要获取聚合根的id和聚合实体的id作为HTTP delete请求的参数 这意味着我需要获取聚合根的id和聚合实体的id作

Domain driven design DDD-只读的聚合

如果我们正在处理一个子域,其中我们只处理只读场景,这意味着我们的实体和值对象将不会更改,那么创建由根及其子项组成的聚合是有意义的还是应该将此上下文的每个实体映射到单个聚合 假设我们有实体A和实体B 在进行修改的上下文中,我们创建一个由实体a和实体B组成的aggregate,其中a是聚合根(假设B离不开a,其中涉及一些不变量) 如果我们将相同的实体移动到一个不同的环境中,而不进行任何修改,那么保持这个聚合是否有意义,或者我们是否应该为实体a创建一个聚合,为实体B创建一个不同的聚合?在2019年,这

Domain driven design 插入和删除的不同聚合根

假设我们有以下聚合根目录: public class Resource { public IEnumerable<Schedule> schedules {get;private set;} ... } 公共类资源 { 公共IEnumerable时间表{get;private set;} ... } 当我们想要添加一个新的计划时,我们需要确保它不会与现有计划冲突。这意味着在resource.AddSchedule(schedule)方法上使用聚合根确保该不变量 另一方

Domain driven design 限定上下文命名

有界上下文名称应该是复数还是单数?为什么?例如,如果我有一个租车网站,我应该拥有一个或多个经销商边界上下文吗?在原始DDD文本中,示例边界上下文是根据该上下文中活动的主题命名的:预订、日程安排、路线安排 这些名称往往与域的自然语言一致,因此我猜您更有可能拥有销售域,而不是销售域,预订而不是预订(但也请参见预订),等等 经销商领域,无论是单数还是复数,听起来都不像是活动的主题,而是一个模型。关联的有界上下文可能是广告/营销,也可能是销售?可能还有一些库存。如果您租用的是商用车,这可能是一个完全不同

Domain driven design 聚合不变量

我怀疑我应该在哪里检查我的不变量 例如,我有一个具有以下不变量的问题聚合: 问题的文本不能为空 问题文本的长度必须在100到500个字符之间 我已经读过,检查不变量的最佳位置是在聚合的构造函数中,但我也读过,例如,建议在值对象中使用推送域逻辑 一个可能的聚合实现可以是: public class Question { private final id: QuestionId; private final text: QuestionText public Question(id

上一页   1   2   3   4    5   6  ... 下一页 最后一页 共 42 页