Domain driven design DDD、值对象和ORM

值对象没有标识。ORM需要标识来更新数据库 如何欺骗ORM (将值对象的Id标记为internal将不起作用,因为ORM位于不同的程序集中,并且将其移动到同一程序集中是不可接受的) 提前感谢。我个人在值对象中有Id字段-我将其视为值对象的另一个属性(如名称、位置等) 这可能不是真实的DDD,但它对我来说很有用。就我对DDD的理解而言,值对象只是划分实体的一种方法。如果一个值对象应该与一个ID一起存储在数据库中,那么它不是一个值对象 示例: 域模型如下所示(C#): 相应的数据库表如下所示(伪SQ

Domain driven design 我应该如何构造我的存储库类?

我是DDD的新手。在我的迷你项目中,我有一个如下结构(与实际名称不同): 入口分类组 入口分类 入口 入口类型 因为这4个实体都是相关的,所以我应该只为它们设置一个存储库类吗?或者我应该为每个条目设置单独的存储库吗?问题是您是否可以独立于条目添加/删除/更新EntryClassification或EntryClassificationGroup,并且它们是否可以独立于条目存在?如果是这样的话,最好有单独的存储库 在这里,您可能关心从存储库中查询数据,但允许您按存储库中的不同字段进行查询,以便

Domain driven design DDD与N层(3层)体系结构

我已经练习DDD有一段时间了,有4个不同的层:域、表示、应用程序和基础架构。最近,我向一位朋友介绍了DDD概念,他认为它引入了不必要的复杂性(特别是针对接口和IoC)。通常,在这一点上,我会解释DDD的好处——特别是它的模块化。所有繁重的工作都在基础设施中,如果我想完全改变底层的数据访问方法,只需接触基础设施层存储库即可 我朋友的观点是,他可以用同样的方式构建一个三层应用程序: 生意 资料 介绍 他将创建业务模型(如域模型),并让数据层中的存储库返回这些业务模型。然后他会调用业务层,称为数据

Domain driven design 这是在DDD中使用域事件的正确方法吗?

我有一个设计问题,我认为域事件可以解决,但我需要确保我以正确的方式进行,并且我正确理解域事件 我在一个聚合根中进行了更改,需要在另一个聚合根中进行更改 因此,当我在初始化聚合根目录中进行更改时,我将触发一个域事件,该事件将在其他聚合根目录中应用更改。如果一切顺利,我有两个数据库事务将被持久化 现在,如果一个失败了(比如第二个),我如何解决这个问题,或者如果第二个失败了,但我最初的改变没有持续下去 我假设这是一个单用户系统,其中所有事情都是同步发生的,因此第二个聚合在第一个启动聚合之前提交 JD这

Domain driven design 持久化引用聚合外部的非根实体

DDD上的所有材料都明确指出这是一个严格的“不”字,但我最近遇到了一个场景,它让我有理由不这样想。想象两个聚合根模板和文档,其中Template-->(1:n)TemplateParam,Document-->(1:n)ParamValue,最后两个根都有一个引用Document-->(n:1)Template 给定的聚合根约束ParamValue不应保留对TemplateParam的引用,只有它可以通过通过Template聚合根获取的临时引用来引用它。现在,如果我想强制执行一条规则,比如“文档

Domain driven design 不使用'的DDD类;没有身份但可以';不能是ValueObject,因为需要变异(更改)

这个问题有一点背景 既然没有人对我的问题给我一个令人信服的答案,我将重新措辞我的问题,让那些回答了疑问的人受益。也许我的问题提得不对 我假设在这一点上你读了我的第一个问题 所以,ContactInfo不需要有域标识,因为它属于用户。没有用户,它“不可能存在”。它只不过是一个类(nhibernate组件),包装了其他类和集合(来自数据库),因此,如果我想将其替换为新实例,使其不可变将是一场噩梦。我需要创建一个包含n个参数的完整构造函数,并重新创建整个对象图,因为我想更新地址集合中的一条街道。在我

Domain driven design 这就是DDD的类结构吗?

假设我的关系中每个客户都有一个地址(在本例中是一个实体),如下所示: 客户{Id,Name,MyAddress(地址实例)} 我是否应该允许结构公开以下选项: MyCustomer.MyAddress.Street = "Pine Street"; CustomerRepository.Save(MyCustomer); 对于Customer类和Address类,这个级联是否应该保存?或者,执行以下操作是否更好: MyCustomer.MyAddress.Street = "Pine Stre

Domain driven design 如何选择合适的事件抽象级别

我想这个问题可能与任何事件系统有关,比如事件源/DDD/Lambda体系结构、ESB、Actors。。。我给这个问题贴上标签,以便有经验的人能够回答 我目前正在试用我的初创公司,使用DDD/Event sourcing world中常用的概念,但应用于javascript单页应用程序。我想要的是一个纯功能的UI,在这里我可以重放内存中的事件日志来恢复UI状态(事件日志不会在浏览器关闭时持久化,它只是为了使事情易于推理,并可能免费启用UI撤消/重做等酷功能,如ELM中的时间旅行调试器…) 有时我

Domain driven design DDD服务方法粒度

所以,我正在建立一个管理联系人的系统。我的联系人域模型有很多字符串属性和布尔值。本着将行为保持在领域模型内的精神,我已经开始创建“更新方法”。我开始觉得这有点麻烦了。在过去,CRUD应用程序只有一个更新方法,可以一次性设置所有属性 我走对了吗?我担心在我的域服务和域实体上有10-15个更新方法 仅供参考,给出的示例有点做作,因此请想象一个具有大量字符串和布尔属性的模型 // Application Layer Stuff public class UpdateContactCommand

Domain driven design 聚合、事务一致性和实体框架DbContext

聚合必须设计为事务性的,并最终保持一致性。实体周围的一致性边界有助于管理复杂性 在我们的存储库实现中,我们使用实体框架与实际数据库接口。历史上,我们总是有大量的上下文(跨越大量的表),它们表示数据库中的每个可用表、字段和关系(或者至少在数据库的某些功能区域中)。这里的问题是,这个上下文被用于数百种不同的事物,并且随着系统变得更大而呈指数增长,导致一些很难维护的东西 有界上下文除法 因此,通常建议为系统中的每个有界上下文创建单独的DBContext。朱莉·勒曼在她的文章中提出了这一点 按总和划分

Domain driven design 领域驱动设计:如何处理具有大量数据字段的复杂模型?

我正在尝试为我的应用程序应用领域驱动的设计原则,使用一个包含数据字段和业务逻辑的丰富领域模型。我读过很多DDD书籍,但它们的域模型(称为实体)似乎非常简单。当我有一个包含10-15个数据字段的域模型时,这会成为一个问题,例如下面的一个: class Job extends DomainModel{ protected int id; protected User employer; protected string position; protected str

Domain driven design 具有聚合字段的域对象

我有这样的域对象: class Customer { string FirstName {get;set;} string LastName {get;set;} DateTime DateOfBirth {get;set;} } 产品团队告诉我:我们必须通过ID获取客户。客户有名字、姓氏、出生日期、年龄和空白字段等信息。可以计算年龄和空白字段。 没有应用程序,只有API。谁使用这个API并不重要 问:如果我遵循域驱动设计,域类客户会是什么样子?我将年龄和空白字段列表(

Domain driven design 以RESTfully方式创建聚合对象

我在我的域中有一个聚合,它有一些Guid辅助密钥。我想通过RESTfull从其他域获取关于这些密钥的更多信息 public class ProductAggregate { public Guid Id { get; set; } public Guid UserId { get; set; } public Guid AgencyId { get; set; } public string AgencyTitle { ge

Domain driven design DDD如何对时间跟踪建模?

我正在开发一个具有员工时间跟踪模块的应用程序。当员工开始工作时(例如在某台抽象机器上),我们需要保存有关他工作的信息。每天都有很多员工在很多机器上工作,他们在机器之间切换。当他们开始工作时,他们会通知系统他们已经开始工作。当他们完成工作时,他们也会通知系统 我有一台聚合机器和一个聚合员工。这两个是具有自己行为的聚合根。现在我需要一种方法来为任何给定的员工或任何给定的机器在任何给定的时间段生成报告。例如,我想知道员工在一段时间内使用了哪些机器以及使用了多长时间。或者我想看看哪些员工在给定的机器上工

Domain driven design 未读评论计数(DDD)

我有一个讨论,一个评论和一个用户。我想显示每个用户的未读评论数。问题是:我应该在哪里放置一个提供未读注释数量的代码?这不是域的一部分,只是一个表示问题 我的想法是创建一个UnderCommentsCenter,它依赖于UnderCommentsRepository,接受DiscussionId和UserId,并返回整数。我将在应用层的某个地方,在某个DiscussionPayloadObject(智能DTO)中访问这个UnderCommentsCenter,它可以访问Discussion[],并

Domain driven design CQRS和事件源查询历史数据

使用CQR和事件源时,如何查询历史数据。例如,如果我正在构建一个时间表系统,该系统有一个收入报告,我需要查询每个员工的小时数、工资率和账单率。有一个包含EmployeeID、PayRate和EffectiveDate的EMPLOYEE\u PAY\u RATE表,以及一个包含ClientID、EmployeeID、RATE和EffectiveDate的BILL\u RATE表。这些表中的生效日期基本上保留了运行历史,因此我们可以准确地报告 如果我们采用DDD、CQRS和事件来源路线,我们将如何生

Domain driven design DDD存储库的查询语言

目前,我正致力于将MonolithRESTAPI拆分成微服务。我想介绍领域驱动设计(目前正在学习)。目前我最关心的是实现存储库 域泛在语言定义了Profile实体(社交媒体配置文件,如Twitter配置文件)。我正在考虑将配置文件提取到单独的微服务中。要查询配置文件,我将介绍ProfileRepository 包括API网关在内的其他微服务都有自己的配置文件搜索模式。我应该如何设计存储库以满足所有这些搜索模式。我应该为每个查询创建find方法吗?我应该介绍一些动态查询语言吗 在整体式架构中,我可

Domain driven design DDD:最终一致性和1对n关系

在我的领域中,我有产品和订单聚合。订购参考产品。这是一个1对n的关系,所以一个产品有很多订单,订单属于一个产品。当产品停产时,将发布ProductDiscontracted事件,并且必须取消属于该产品的所有订单。因此,有一个适配器通过RabbitMQ接收ProductDiscontracted事件。然后,适配器将取消订单委托给应用程序服务。如何在一次交易中取消单个订单?适配器是否应该迭代已停产产品的所有订单,并为每个订单调用应用程序服务?我是否应该忽略在一个事务中修改多个聚合,并使用所有受影响的

Domain driven design DDD-在单个有界上下文中共享相同数据库表的两个聚合根

我有一个第一个聚合根,它有一个自然Id,封装了与同一主题相关的不变量 突然,一个新的业务需求出现了,在一个与第一个聚合完全不同的主题上有一组新的不变量。这是在相同的有界上下文中创建新聚合根的绝佳时机 但是,两个聚合根具有相同的自然Id。并且两个聚合根具有一些相同的属性(但不是全部)。这些相同的属性可以修改,但我不想引入域事件流来传播这两个聚合中的数据更改(因为我们不能在同一事务中修改两个聚合) 一种选择是重新组合这些聚合根。它们处于相同的有界上下文中,并且具有相同的自然Id(它们“表示”相同的事

Domain driven design DDD-无延迟加载-如何在不耗尽数据库的情况下执行某些任务?

我正在为一个更大的解决方案开发一个模块。 在这个解决方案中,他们过去曾尝试使用DDD。 然而,事实并非如此,因为没有DDD专家。(现在还没有一个人在场。) 所有内容都在单个根聚合下,启用了延迟加载,等等 现在,对于新模块,我们希望使其更好。 但是,我没有看到如何在不延迟加载的情况下使用DDD,并且不耗尽整个数据库 例如,我有一个对象,我们称它为“B” B有一面旗子让我们说“令人敬畏的旗子” B有孩子 如果B的其中一个孩子很棒,那么B也很棒 如果B的孩子都不可怕,那么B就不可怕 现在如果我不与DD

Domain driven design 活动来源关系和基础

我为一家初创公司工作,我们希望通过活动采购建立一个基本的概念证明。有人能就这些基本问题作出澄清吗 事件源是事件流的集合吗 每个有界上下文是否有一个事件源?或者可能是每个DDD合计(比如一辆汽车及其变化) 每个事件源是否都有自己的数据存储 例如,汽车的事件源,其中每个事件流都基于唯一的carId 关于可能的基本流程的问题…这听起来完整且有意义吗 客户机-->事件存储API-->存储事件-->可能会将消息发布到队列-->确认客户机并竖起大拇指-->开始构建读取模型/索引?-->客户端公开发布事件--

Domain driven design DDD策略设计:共享内核模式与发布语言模式

在域驱动设计(DDD)中选择的共享内核和发布语言策略模式之间的主要区别是什么?共享内核和发布语言都是上下文映射模式集合的一部分。上下文映射是一个非常有用且功能强大的工具,它可以让人们看到什么样的依赖关系将系统连接在一起。它们还可以突出显示团队关系。 一个共享内核意味着两个系统通过共享一个共享工件(模型、DLL、Jar、DB等)而强耦合。如果这两个系统由两个不同的团队处理,这意味着无论何时团队A更改某些内容,都会影响团队B,反之亦然。 发布的语言是一种记录良好的模型,每个人都可以理解和翻译。想想i

Domain driven design 域服务和针对数据库的通信

如何在域服务和数据库之间进行通信?您使用存储库的方式是否与从聚合根目录使用存储库的方式相同?还是将域服务放在聚合根服务中?到目前为止,我的服务已通过构造函数依赖关系直接使用存储库 您是在聚合根模型中包含服务,还是服务层通过方法参数在域模型上运行

Domain driven design 使用DDD时避免使用getter并使用DTO检索信息

关于在使用域驱动设计时避免域对象上的getter和setter。对于希望将持久存储中的信息呈现到屏幕上的用例,遵循此架构模式时,对象模型会是什么样子 我是否希望看到直接从存储库或独立的DTO服务检索DTO,直接将DTO实例提供给“UI层”(比如控制器)?看看CQR;其概念是,您将从报表服务或报表视图特定的数据存储返回视图特定的DTO

Domain driven design 聚合根引用其他聚合根

我目前正在大量使用DDD,当从其他聚合根加载/操作聚合根时,我面临一个问题 对于模型中的每个聚合根,我还有一个存储库。存储库负责处理根目录的持久性操作 假设我有两个聚合根,其中有一些成员(实体和值对象) AggregateRoot1和AggregateRoot2 AggregateRoot1有一个引用AggregateRoot2的实体成员 加载AggregateRoot1时,是否也应加载AggregateRoot2 AggregateRoot2的存储库是否应该对此负责 如果是,Aggregate

Domain driven design DDD-聚合中子对象的修改

我很难找到处理相当复杂情况的最佳方法。我见过很多类似的问题,但没有一个能让我满意地解决这个问题 使用多个订单行(子实体)创建订单(聚合根)。根据业务规则,每个订单行必须在订单的生命周期内保持相同的标识。订单行具有许多(20+)属性,在订单被视为“锁定”之前,可以相当频繁地进行变异。此外,还有一些不变量必须在根级别强制执行;例如,每个订单行都有一个数量,订单的总数量不能超过X 我不确定在考虑对订单行进行更改时如何对该场景建模。我有4个选择,我可以想象,但没有一个是令人满意的: 1) 当需要修改订单

Domain driven design 协调不同的有界上下文,这是谁的责任?

我有3个使用不同数据库和REST接口的独立服务: 第一服务:客户信息 第二项服务:客户交易信息 第三项服务:有关客户文档的信息 问题: 每个客户都有一个状态,应该根据其交易和文档进行评估 哪个服务应该负责此评估,我应该如何实现其他服务之间的协调?如果可以,我将创建第四个服务。这样,您就有了一个返回所需内容的服务,从而避免了调用2个服务并合并结果集的问题(以及过于频繁的聊天)。否则,如果您无法创建第四个服务,可以编写一个代理服务,通过一个调用调用其他两个服务,并在可能的情况下使用数据缓存来缓存

Domain driven design 行为驱动开发(BDD)如何与领域驱动设计(DDD)协同工作

我对BDD的理解是,一个人在用户故事中描述一个系统,然后开发人员将这些用户故事转化为一个应用程序,目的是在每个“冲刺”(软件开发阶段)中增加真正的业务价值。结果(据我所知)是,在整个开发过程中,域模型从用户故事中出现。也就是说,在第一次“冲刺”之后,许多领域模型将不会被设计 我对DDD的理解是,软件开发继续参考完整的领域模型,尽管这是一个不断发展的模型。在DDD中,模型预计会发生变化,但它始终是“完整的” 这似乎是两种方法之间的根本区别。人们是如何处理这个问题的?BDD做得好并不能产生一个“完整

Domain driven design 从DDD到CQRS的存储库转换

最初,我的DDD存储库类似于以下示例: class PersonRepository { Person findByID(id) List<Entity> findAll() List<Entity> findWithRegex(String) } class PersonRepository{ 找到的人id(id) 列表findAll() 列表findWithRegex(字符串) } 在内部,GUI提供了一种服务,用于将实体对象转换为DTO对

Domain driven design 用AutoFac装饰存储库

您好,我有一个可能是一个常见的问题,我认为Autofac或任何IoC容器都不能完全解决这个问题。这可能是一个设计问题,我需要一些新的投入 我有EF6的经典MVC web解决方案。它是以真正的DDD风格实施的,具有反腐败层、三个有界上下文、跨领域关注点和基础设施项目。看到所有部件都以良好的方式安装到位,我感到非常高兴。我们还向域中添加了CUD操作的命令 现在问题来了。客户需要一个跟踪每个实体属性的更改日志,更新完成后,我们需要在更新前后将其保存到更改日志值中。我们已经在一个iLogger服务中成功

Domain driven design 有界上下文的实现与设计

假设我有两个有界上下文,发货上下文和计费上下文。每个上下文都需要了解客户 在数据级别,客户由数据库中的CustomerTbl表表示。此表由描述客户的所有必要列组成 CustomerTbl中的列(简化): Name 物理地址 PaymentMethod 配送上下文与名称和物理地址有关,而计费上下文与名称和付款方法有关 在发货上下文中,我对聚合的收件人进行了建模: Recipient现在拥有Name和physicaldaddress 在计费上下文中,我对聚合付款人进行了建模: Payer具

Domain driven design 服务层DTO—大型复杂交互式报表类对象

我有一些会议对象,它们构成了日程安排系统的基础,其中GridView用于显示重要信息。这是为了安排员工参加会议,并让员工查看已安排的内容 我一直在尝试遵循DDD原则,但我很难知道从我的服务层到系统的表示区域应该传递什么。这是因为时间表可能很大,实际上由系统的许多不同元素组成。例如,客户名称、地址、案例信息、组等,所有这些都是会议调度员做出决定所必需的 除此之外,调度器还需要更改此计划中的值,并将其传递回服务层(例如,从下拉列表中分配员工,可能是更改组等)。因此,信息不是真正的“只读”——它需要与

Domain driven design 域实体设计

哪种方法更好更正确 class Project int Id string Name int CategoryId 或 项目,而不是项目,因为每个实例将代表一个项目。IMHO域类,而且,所有类都应以单数声明,因为它们代表一个类型。对不起,两者都代表单个项目。重点放在Category属性上,这在某种程度上取决于实现(即您使用的是Hibernate还是其他有自己风格的ORM?)。您可能不想将ID称为“Category”,除非某种ORM魔法使其具有吸引力。ID是一个ID,而不是什么。我将本机ADO.

Domain driven design 自下而上的方法有什么问题

我无法清楚地理解自底向上方法的问题,而领域驱动设计正是针对这种方法提出的。有人能简短地写一下吗,或者让我朝着写的方向走? 我的意思是,在Sql世界中,我们有由表表示的实体,它们有关系、约束等等。那么,DDD提出的以类作为实体的新方法对我们有什么好处呢?但在此之前,正如问题所表明的那样,我需要理解自下而上方法所带来的问题。在Mike中,请详细解释: 域不应该被基础设施细节所污染。如果你 从db(botton up方法)开始,一切都会随之发展 它也将受到它的约束。但是您不构建应用程序 对于数据库,您

Domain driven design DDD:域服务的实现放在哪里

域服务实现应该驻留在DDD项目结构中的什么位置? 如果我们有IDomainInterface和DomainInterface实现,那么DomainInterface实现应该驻留在解决方案/项目的基础架构或核心/域部分吗?域服务接口,它们的实现可能驻留在域层。但是,如果域服务实现依赖于基础设施问题,那么通过应用依赖倒置原则,实现将位于基础设施层,同时依赖于域中定义的接口 大多数域服务将不需要依赖于基础设施问题,并将用于对在现有聚合中找不到自然归属的用例进行建模,但一些域服务会这样做 存储库是最常见

Domain driven design 事件来源的正式规范是什么?

有很多资源介绍了ES的几个方面,但大多数都是优点/缺点列表或示例片段。术语,如投影,应用,重播,也(主要)在没有解释的情况下使用,或在稍微不同的上下文中使用 具有相应文档和额外资源的最佳示例实现是来自Microsoft的,可以从中学习很多,但它不是权威性的 我能找到的最接近非正式规范的是,但他的整个网站已经关闭了几个星期了 这可能是因为这种全面的指导方针并不存在,因为这是一个流行的概念,人们拿起它,开始使用它,因为他们认为合适,没有人会再就细节达成一致 更新(2/16/2018 11:03)

Domain driven design 在DDD/分层体系结构中存储常量的位置

例如,我有一个媒体实体,它有媒体类型值对象,负责保存/创建媒体类型。存储可能的介质类型常量列表的最佳位置是什么?首先,我认为它应该存储在MediaType中,因为它负责创建类型。但是,如果我在应用程序层或接口层需要它来验证请求,甚至在查询中,该怎么办呢 看起来如果我想隔离域,我不能在MediaType中存储常量,因为我不能在域之外使用它。或者只在域层中使用常量,而在其他地方硬编码它,对我来说似乎是不正确的,因为在这种情况下,我们没有一个地方可以更改它。第三个选项是创建单独的常量类,如mediac

Domain driven design AutoMapper模式是否违反DDD原则?

我最近在尝试Abp框架,并愉快地发现它是DDD的一个极好的实现。但由于它使用AutoMapper将DTO转换为实体/聚合,我注意到它能够短路聚合的私有setter,这显然违反了DDD的主要规则。虽然AutoMapper的目标是减少手动操作,但DDD强调通过私有设置器保持不变 我如何才能澄清这两个看似冲突的概念,并顺利使用该框架?这是否意味着我必须放弃AutoMapper以保持DDD原则,反之亦然 我相信AutoMapper不是DDD的反模式,因为它在社区中非常流行。换句话说,如果AutoMapp

Domain driven design 从多个数据库填充聚合根

我是DDD的初学者,希望了解尝试从多个数据库中填充单个聚合根是否是一种不好的做法 我试图设计一个系统,其中聚合根的所有属性都是从一个数据库填充的,除了名称。名称恰好位于不同的数据库中,需要填充到聚合根目录中才能使用 TIA简短回答:是的,这是一种糟糕的做法(甚至不是一种做法) 如表所示: DDD聚合是可以作为单个单元处理的域对象集群 此语句的后果之一是需要以事务方式存储聚合。聚合代码将确保其在内存中的状态一致性,但如果无法在数据库中强制实现该一致性,则会出现问题 将聚合存储在多个数据库中意味着要

Domain driven design 如何避免一个贫乏的领域层,仍然有丰富的验证和业务规则

如果您有一个域对象,并且您想做一些对该域对象的责任非常重要的有用的事情,比如确保它是有效的,那么您有时需要访问相关对象的状态以执行此验证 如何避免域对象需要调用存储库或数据访问层?由于性能的原因,即使是延迟加载,也不能始终遍历集合关系,而且您通常希望在域对象中执行查询。您可以将依赖项注入存储库实现到域中,但这并不是纯粹的测试,也不会使测试复杂化 我一直很放松,允许使用DI从域访问存储库。我还没有看到过一个清晰的例子,说明如何在一个复杂的应用程序中拥有一个“纯”的域层,而这个应用程序也不是贫乏的,

Domain driven design 值对象如何存储在数据库中?

我还没有看到任何示例,但我假设它们保存在数据库中包含实体的表中 例如,如果我有一个Person实体/聚合根和一个对应的Person表,如果它有一个名为Address的Value对象,那么Address值将保存在这个Person表中 对于我拥有其他实体(如公司等)且有地址的领域来说,这有意义吗 (我目前正在编写一个项目管理应用程序,并试图进入DDD)可以将值对象存储在单独的表中,原因正是您所描述的。然而,我认为你误解了实体和VOs——这不是一个与持久性相关的问题 下面是一个例子: 假设公司和个人都

Domain driven design 可以聚合根实体调用存储库

聚合根实体是否可以有一个方法来调用存储库 我知道这不应该,但我想得到证实,因为埃里克的书也没有说清楚:( 还有一件事,我在哪里可以得到域驱动设计的单元测试示例?可以?-是的 应该吗?-不 但是,所有答案都是上下文相关的,您不提供您的答案 一般的建议是寻找“服务”或“规范”类型。这是一个有点宗教色彩的问题。 一些人认为这没有问题,而另一些人可能认为这样做是异端邪说 虽然我通常总是让我的存储库远离我的域模型(并且有一个上游服务对象处理存储库),但我有一个项目“需要”从域模型访问存储库。 这是因为域对

Domain driven design 在电子商务网站上开始域驱动设计

很难弄清楚如何对预期的产品行为建模 基本上,客户的库存是按照产品和SKU进行管理的 一个产品有多个sku,但一个sku代表多个产品属性 让我举个例子 比如说我要卖给你一件衬衫。“衬衫”是带有某种产品ID的产品。如果它有小、中、大三种尺寸,那么每种尺寸都与sku关联 到目前为止很简单,但是如果衬衫也有多种颜色,比如说红色、黄色和绿色,那么将有九个SKU(红色/小、红色/中等、红色/大、黄色/小,等等) 此外,不同产品的属性类型可能不同,这也是一个挑战。衬衫可能有尺寸和颜色,手提包可能有不同的把手样

Domain driven design 领域驱动的重复设计方法

我目前正在阅读Eric Evans的《领域驱动设计》一书,其中有一个概念我遇到了麻烦 根据这本书,所有聚合都应该有一个聚合根,聚合的所有成员只能通过这个根访问。根还应该负责执行不变量。这不会导致大量的方法重复吗?以以下场景为例: 我有一个类Order,它由一组OrderLine组成。在这种情况下,类Order是聚合根,它必须强制执行一个不变量,即单个订单的所有订单行必须具有唯一的订单号。为了确保不违反此不变量,类Order不公开其OrderLine的,只提供一个方法updateOrderline

Domain driven design DDD如何在模型中生成唯一地址而不检查持久层?

我的域中有一个地址模型,它有一些复杂的地址生成逻辑(想象一下类似于IBAN),但由于地址很短,可能会与数据库中存储的现有地址发生冲突。既然有一种既定的做法,即模型不应该访问存储库,那么如何实现这一点呢? 我是否应该在服务层创建一个实例,然后对照存储库检查它?从技术上讲,每个域用例都是一个服务。当您需要添加新的地址时,只需创建对象,然后验证是否存在类似的内容 在您的服务中,您可以使用查询来检查地址是否存在。如果希望它是一个存储库方法,那么它意味着Address是一个实体。但是,请注意,唯一性是一个

Domain driven design 用户注册的最终一致性

我们的项目是使用DDD开发的。我们决定将用户身份移动到单个微服务,该微服务将用于检查用户身份、颁发和验证令牌 现在,由于帐户和用户位于不同的微服务中,该微服务解决了处理用户和帐户详细信息的问题,因此我们遇到了一个称为“最终一致性”的挑战 我们面临的问题是,我们应该首先在accounts和users microservice中创建帐户/用户,然后将事件发布到user identity microservice,或者反之亦然 在第一种情况下,我们将立即获得帐户和用户的基本信息,但由于最终的一致性延迟

Domain driven design 将聚合验证放在何处?

我有一个关于外部聚合验证的问题 在我们的域中,合作伙伴可以下包含特定产品的订单(1) 一旦下了订单,他可以在我们的系统中将其标记为已付款 一旦订单标记为已付款(4),我们将为外部图书馆服务(5)中的产品分配许可证 一旦我们知道许可证被分配,我们就结束了整个传奇 下面是一张小图,说明了该过程: 此时,除了命令、命令处理程序和事件之外,整个过程还涉及两个域类: 包含业务逻辑的订单聚合 订购传奇,协调整个流程并分配许可证 现在,有一个不变量在这个过程中还没有建模——在我们将订单标记为付费之前,我

Domain driven design DDD-由于聚合数据不同而导致多个有界上下文?

我们试图将我们的领域划分为有限的上下文,目标是有一个模块化的应用程序设计/架构 我们做了一个启发性的事件分类会议,它帮助我们识别有界上下文及其集合。研讨会结束后,每个参与者都同意我们确定的有界上下文 尽管如此,我们还是感到不舒服,因为我们担心我们的有限环境仍然太大。EventStomring专注于域事件/流程,这是我们用来识别有界上下文的主要构建块 我们还确定了诸如“合同”之类的集合。每个契约几乎遵循相同的过程,但是这些契约包含的数据量可能会有很大差异。有非常简单的合同类型和包含大量附加数据和附

Domain driven design Axon框架:聚合加载时发送命令

我们正在用Axon Framework 4.1构建一个微服务系统。在我们的领域中,我们有一个标签概念,可以将标签附加到其他实体。虽然标签通常由用户创建和管理,但其中一些标签是“特殊的”,需要硬编码,但它们也需要出现在事件流中 我们有一组集合,它们表示可以用这些标签标记的实体。其中一些聚合将经常使用,而其他聚合可能不经常使用,甚至被用户放弃 有时我们会想出新的特殊标签。我们将它们添加到代码中,然后还需要将它们添加到事件流中。这样做的好方法是什么 我们可以创建一个特殊的命令,当更新的服务第一次启动时

Domain driven design 用例接口(应用程序服务)?

当遵循具有ddd原则的六边形体系结构时,用例或应用程序服务是否应该具有接口和实现?例如,用例“删除一个视频”,它是否应该有IDeteVideo(接口)和DeletVideoImpl(实现)来实现该接口 如果答案是肯定的,用例的接口应该在哪里,在域层还是在应用层?很明显,实现应该始终在应用程序层 我认为用例不是经常变化的,所以在我看来,没有必要有一个接口,有了实现就足够了。但在六边形架构和DDD原则方面,是否对此进行了说明 提前感谢。当使用hex arch实现DDD时,应用程序服务的接口是驱动程序

上一页 1 2 ...  5   6   7   8    9   10   11  ... 下一页 最后一页 共 42 页