我知道规范模式描述了如何使用实现isspecification的类层次结构来评估类型为T的候选对象是否匹配某个规范(=满足业务规则)
我的问题是:我想要实现的业务规则需要评估几个对象(例如,客户和合同)
我的双重问题:
是否有规范模式的典型调整来实现这一点?我只能考虑通过我的specification类删除isspecification的实现,并在issatifiedby()方法中获取我想要的尽可能多的参数。但是这样做,我就失去了将此规范与其他规范相结合的能力
这个问题是否暴露了我设计中的缺陷
有些属性对于域来说毫无意义,但对于存储库来说却是必不可少的,例如分区键
在我的存储库中有一个DTO可以扩展实体的基本实现,添加相关字段吗?完全可以。只要此DTO保留在存储库中。
在福勒的诗中:
存储库模式描述为:在域之间进行中介
和数据映射层,使用类似集合的接口
访问域对象
只要存储库正确地执行其工作(存储和获取域模型),实现就无关紧要。
只要确保存储库的任何实现细节都不会在项目的其余部分传播。如果将DTO添加到存储库中的实体中,请确保返回的实体中没有DTO或其他不相关的额外字段。请小心:引用文
我是CQRS的新手,在我的设计中需要以下情况的建议。命令更新聚合A的状态;因此,需要使用交叉聚合计算方法的结果更新读取模型;该方法属于另一个骨料B,其中包含对骨料a的引用;该方法是聚合B和引用聚合a状态的函数。调用此函数的正确位置在哪里
我的注意事项(可以跳过):
命令处理程序更新聚合A的状态可以从存储库中获取聚合B,对其调用计算并将结果放入域事件中;然而,我相信,除了一个被修改的聚合之外,获取聚合不是命令处理程序的工作,即使是为了读取目的;另外,命令处理程序的任务不是执行计算,只是发送事件,
假设我有两个实体-Foo和Bar。Foo是一个聚合根,包含Bar。据我了解,应该是这样的:
public class Foo{
private readonly Bar Bar;
}
我想为用户提供从定义的列表中为Foos选择条的功能(并对其进行更改)
若存储库应该只用于聚合根,那个就意味着Bar实体将并没有存储库
这就导致了问题-如果不引用Foo,就无法独立创建/更新工具栏
这是否意味着Bar应该有一个存储库,尽管没有Foo它没有任何意义?您确定Bar需要是一个实体吗?您是否需要在域
我使用NHibernate进行持久化,但我在某处读到NHibernate充当unitofwork容器。所以我需要创建一个单独的UnitOfWork实现吗
或者继续使用Nhibernate的unitofwork。您不需要创建单独的UoW实现。
我建议您阅读这篇文章:根据Martin Fowler的说法,工作单元模式“维护受业务事务影响的对象列表,并协调更改的写入和并发问题的解决。”
Nhibernate内部已经实现了这个模式,跟踪所有被修改(添加、更新、删除)的对象。您不需要做任何事情,因为它本身
我现在正在研究CQRS,我看到了一些源代码(Greg Young的SimpleCQRS和Mark Nihjof的)。
我仍然混淆了命令和域事件。
我们是否总是需要在域事件处理程序中持久化域以“写入数据库”?
如果我调用代码将域保存到命令处理程序中的数据库(通常通过域存储库),然后让域事件处理程序处理其他事情(例如:更新读取模型和执行其他服务,如电子邮件通知),这是否常见。
谢谢。存储事件:我不会使用事件处理程序持久化事件。使用eventsourcing时,将其从命令处理程序委派到存储库或工作单元
更新:
我想知道的是,我是否应该单独创建每个类,而不是在类中添加getter/setter属性,我的意思是:
因此,为了创建访问,我应该在访问中使用以下道具
VisitName, Purpose, StartDate, EndDate, HostId, HostName, RequesterId, RequeserName
或者我应该有这个:
VisitName, Purpose, StartDate, EndDate, IPerson Host, IPerson Requester
结束更
我用UML(在纸上)快速定义了我的领域模型,当我开始测试驱动功能时,重构使我得到了一些小类,它们不代表我的领域中的概念,但这些类很好地封装了所需的职责
例如,我从一台拥有多个许可证的机器开始(机器-->*许可证)。我从方法Add(licenseType)和remove(licenseType)开始,它们增加或减少列表中相应的许可证对象(即许可证有一个licenseType和该类型许可证数量的计数器)
机器有其他关联和行为,所以我创建了一个LicenseTypeManager,其中我现在有机器--
当我读到DDD、模式和应用程序体系结构的许多其他主题时,我脑海中有一个问题已经激荡了几个月。我将用一个MVC web应用程序来构建这个框架,但我确信,问题要广泛得多。这就是:对域实体的坚持是否会在应用程序中造成僵化和低效
DDD方法对于管理应用程序的业务逻辑以及作为与涉众合作的一种方式是完全有意义的。但对我来说,它在多层应用程序的上下文中会分崩离析。也就是说,当一个视图需要一个实体的所有数据或者甚至两个存储库都拥有这些数据时,很少有场景。就其本身而言,这并不坏,但这意味着我会进行多个查询,返回一
在阅读了许多关于棱镜的文章之后。我还是很困惑
我正在尝试创建一个应用程序,其域对象将完全独立于GUI。用户还可以从命令行与应用程序交互。所以完全解耦。我正在尝试创建域对象的独立组件,这些组件可以使用一些事件相互通信。我应该如何实现这一点
我应该在域对象中使用事件聚合器吗?有几个职位相同,但他们没有给我一个满意的答案
如果没有,那么在域对象中实现相同功能的最佳方法是什么。您不应该在域对象中使用Prism中的事件聚合器,因为它用于UI事件。如果您希望在域模型中具有类似的行为,则应该使用。实际上,事件
问题:
1.知道Foo->Bar之后,FooRepository.FindId()将如何构造Foo实例及其引用的Bar实例?(假设使用EntityFramework,并且据我所知,EntityFramework自动构建实体及其依赖项)
2.假设Foo实例引用了Bar实例,那么FooRepository.Update()是否也应该保留对Bar实例所做的更改?
如果答案是否定的,假设Entity Framework是用于数据库访问的技术,那么某个服务如何告诉存储库(或者更准确地说是EntityFra
我对DDD中的工厂、存储库和服务有一些问题。我有以下实体:文件夹、文件、文件数据
我认为“文件夹”是一个聚合根目录,应该负责创建文件和FileData对象
所以我的第一个问题是,我应该使用工厂来创建这个aggreate,还是由存储库来创建?现在我有两个存储库,一个用于文件夹,另一个用于文件,但在我看来,我应该将它们合并在一起。下面的代码片段显示了我的文件夹存储库,它位于我的基础结构层中:
public class FolderRepository : IFolderRepository
{
我使用CQRS瘦读取层为UI提供非规范化列表/报告数据
在我的应用程序的某些部分中,我希望提供一个搜索框,以便用户可以过滤数据
Lucene.NET是我目前选择的全文搜索引擎,因为我以前已经实现了它,我对此非常满意
但是,在CQR中,搜索的一面在哪里合适呢
我看到两种选择,但可能还有更多
1] 我的控制器可以将搜索字符串传递给搜索层(Lucene.NET),搜索层返回一个ID列表,然后我可以传递给CQRS读取层。读取层将获取这些ID并将它们组装到(1,2,3)子句中的WHERE ID中,最终将D
让我们假设一个呈现这些规范的项目:
每个员工都可以组织一次会议邀请其他员工
每个员工都可以接受参加会议的邀请,但不会超过最大参与人数s
员工创建者的任何经理都可以随时取消会议
在国际海事组织中,不变量是:
只要创建者(员工)存在(未删除或标记为已删除),会议就存在
任何时候都不应召开会议,会议的参与者人数不得超过预期限制
任何取消其创建的会议的员工也应取消/删除该参与
当经理取消员工的会议时,应同时删除会议和参与
我是否应该:
Employee是一个聚合根目录,包含其创建的会议的集合
嗨,我正在启动一个使用DDD的项目
我想使用Asp.Net标识进行用户身份验证,但标识与Asp.Net非常耦合,域模型对象不应具有依赖关系
这让我想到身份验证可能是一个不同的BoundedContext,它不使用DDD实现
我想知道是否有人遇到过同样的情况,你认为我有什么选择
谢谢对我来说,不使用DDD就可以实现身份验证。DDD方式非常耗时/昂贵,只在您的核心域(具有最大商业价值的代码)中使用DDD是可以的
请记住,如果您想将自己从框架中分离出来,您可以始终将自己隐藏在接口后面。在这种情况下,您
存储库应该从服务调用返回什么?
例如,一个实体(或实体集合)或对其自身的引用,可以用来访问包含实体集合的属性
以以下示例代码为例:
$user = $userRepository->findById(1);
或
我认为在大多数代码中,这样的调用会返回用户实体对象或用户集合实体
对我来说,这似乎有点奇怪,从一个方向来说,存储库将直接返回对象,但从另一个方向来说,它将在对对象执行操作之前保持它们的状态。以此示例代码为例:
$user = $factory->make('user');
我试图将DDD原则与CQR一起应用,但在集成有界上下文时遇到了困难
让我们考虑市场域中的目录和计费上下文。我在公元前1世纪将产品概念建模为目录集合的实体,在公元前1世纪将其建模为集合
现在我有了这个“商家用户界面”,商家可以在其中将产品添加到他的目录中。进行此操作时,他将提供产品名称、说明和其他一些分类和定制数据,以及销售价格、折扣政策等
我应该如何在两种有限的环境中传达产品的创建?
我考虑过以下方法,但没有一种适合我:
创建一个命令,收集商户通过UI提供的所有数据,然后让控制器或应用程序服务
我有一个域对象的聚合Order和OrderItem订单是聚合根
给定一个订单,我想得到一个特定的订单项(比如,第3个)。问题是我不想预先填充Order.OrderItems。相反,我想按需查询它,得到我所需要的
因此,我需要将此代码放入Order存储库中,因为我需要从数据库中读取。我的问题是,如果这在DDD上下文中是正确的,如果是,您能给我一个我应该使用的签名示例吗?非常感谢。您不应该查询您的域名
聚合根总是从完全构成的存储库返回
您可以实现一个特定的查询/读取模型。在c#world中,我通常只
我有以下域对象结构
Invoice
- List<Items>
- Service
若我理解正确,在这个场景中,发票是聚合的,项目是实体,服务是项目的价值对象
若我需要向数据库添加新服务,会发生什么。我是否应该创建一个新的服务类,然后为该场景聚合,并拥有自己的存储库?服务是否可以独立存在看起来他们可以根据你上面所说的
如果需要向数据库添加新服务(我假设服务是独立的),则需要创建服务聚合根。还将有一个服务存储库等用于添加它
聚合根和存储库始终是一对一的。他们的关键是了解
我是CQR活动采购的新手。我试图定义我的计划的总根。
假设我有两个实体:车和人。还有一个不变量:一辆车只能由一个人拥有
它基本上是人和车之间的一对一关联
我有三个命令:
重新粉刷汽车(仅提供汽车id)
更换车主(提供车号和新人号)
重新油漆个人拥有的所有汽车(仅提供个人id)
如果我使用Car作为AR,命令#1可以快速运行。我将推动一项CarRepaint活动。命令#2也可以快速运行(push CarIsOwnedBy事件)
但问题发生在command#3上,我需要经历商店中的所有事件,才能让每
我正试着绕着DDD转
假设我们有一个求职板网站,组织可以在那里发布职位,申请人可以申请
我的理解是否正确,将有一个招聘领域,包括:
JobPost和JobPostApplication作为聚合
雇佣组织和申请人作为各自集合的实体
如果是,将如何:
申请人与来自Auth域的用户相关
雇佣组织与组织域中的组织相关
你会怎么做
申请人与来自授权域的用户相关
雇佣组织与组织领域中的组织相关
通常:共享标识符。某些值(通常是不透明的标记,如UUID)由两个上下文共享,因此我们可以在数据随时间演化的
几个月后我将开始一个绿地项目
该项目将包含大量的业务逻辑,分布在几个子域中。是的,我们将使用领域驱动设计的原则。
技术将包括Spring、Spring引导和Hibernatestack
我正在研究一些Java LIB,以涵盖基础设施方面的内容,如:
域事件发布
事件存储
事件重复数据消除
用户端的重排序器
投影
可靠发布
可靠的交付和重新交付
我遇到了Axon框架。我已经听说了,不知道细节。所以我读了一些博客文章,一些文档,并在Youtube上观看了一些广播
它看起来很有前途,我正在考虑使
我正在学习领域驱动设计,但是有一些实际问题让我感到困惑,我认为看到一些好的示例可能会澄清这些问题
有人知道一些很好的工作代码示例,它们很好地模拟了基本的DDD概念吗
特别感兴趣
说明性领域模型
存储库
域/应用程序服务的使用
价值对象
聚合根
DDD样本的困难在于,它们通常是特定于领域的,并且最终系统的技术实现并不总是显示在建模领域时做出的设计决策和转换,而这正是DDD的核心。DDD与其说是代码,不如说是过程。(正如有人所说,最好的DDD示例就是这本书本身!)
这就是说,一个评论良好的示例应用
因此,我们可以将领域驱动设计应用于多个项目,但同一个领域模型可能存在交集
在这种情况下,如何应用域驱动设计(使用ORM、模型优先、生成数据库模式)?使用许多相同的表创建多个数据库?或者如何共享数据?使用同义词?解决共享模型(包括数据)的可能策略是什么
欢迎提出任何建议。提前谢谢 您可能想(重新)阅读中的战略设计模式。您可能想(重新)阅读中的战略设计模式。在我之前的项目中,我们就在多个模型中有一些共享部分的冗余信息进行了大量讨论
我们发现有趣的是,我们认为几个项目(不是C#proj,而是真正的大型
我正在重组我目前的项目,以便更好地符合DDD最佳实践
作为此设置的一部分,管理员任务允许基于配置文件/algo组合(重新)引导某些域对象/聚合。我有一个很好的用例,它确实要求它成为一个实时系统的一部分,而不仅仅是测试(比如文本装置)
我正在努力在DDD环境中对其进行最佳模型重构:
基本上:构建器/引导器是属于与域对象相同的有界上下文的基础设施服务吗?这感觉自然吗?我看到的流程是管理员使用一个特殊的管理员应用程序服务访问这些函数,该服务反过来调用构建器来完成他们的工作
另一方面,这个管理功能感觉像
恐怕我已经知道答案了,但我希望有人能提供一个以前没有的替代解决方案。和往常一样,按照DDD进行测试比我想象的要困难,但我的情况是这样的
我们有两个ARs,用户和角色组
可以向用户授予特定角色组,从而获得该角色组中角色(集合值对象)提供的权限。角色组的标识作为另一个VA保存在用户AR中
当从系统中删除角色组时,我们会引发一个域事件,处理程序使用该事件查找引用该角色组的所有用户并删除引用。相应的投影反规范化程序将使用同一事件来更新用户的有效角色。这是授予该用户的单个角色和所有授予角色组的角色的组合
当操作在概念上不属于任何实体或值时
对象,而不是将行为强制到对象中,我们
应该创建一个域服务
一个服务的接口应该根据其他方面来定义
域模型的元素。换句话说,参数和返回
服务的值应该是域对象
a) 为什么域服务应该/必须使用域对象作为参数和返回值
b) 为什么DDD不要求实体和值对象的方法将域对象用作参数和返回值?为什么这一约束只适用于服务
多谢各位
EULERFX:
(一)
这两个约束都促进了不变性和功能性风格
a) 这两个约束如何促进不变性
b) 什么是功能性风格
c) 因此,我们应该尝试(因
我正在认真考虑使用,来实现一个基于事件的系统。但是,我不确定Greg Young的EventStore是否支持快照。快照是我的应用程序的关键要求,因为我们不希望每次都重播所有事件来构造对象状态
有人能给我提供如何在EventStore(Greg Young版本)中创建快照的示例吗?是的,只需将它们放在流中并读取该流的第一个值(向后)
例如:
读取时,从快照流中读取最后一个快照,然后从它指向的版本中向前读取
您还可以有许多具有许多不同快照的流。我相信常见的域包装器已经支持这一点了
此外,在我们的讨
如何在DDD中访问用户配置的设置
我们有一个配置数据库,它将项存储为一组键值对。这似乎并不符合存储库模式,因此如何使用户能够访问这些配置值
理想情况下,我希望为不同的配置分组创建单独的类,即。。账单设置、报表设置、税务设置
为每个设置类提供单独的存储库似乎有些奇怪,但我还想为这些设置类维护持久性
在DDD中启用配置访问的正确方法是什么?我通常只使用接口抽象配置,例如IBillingConfiguration,IReportConfiguration,等等。然后将这些实现传递到相关方法中(或注入相
让我们举一个简单的例子。我们有两个模块。一个模块是关于一些问题的,我们有实体问题。此实体需要来自其他模块的实体,即用户
当我需要列出所有问题(及其作者)时,我的QuestionRepository也需要获取用户。问题:
QuestionRepository创建Question和用户可以吗
或者应该从UsersRepository获取用户,这意味着QuestionRepository链接到UserRepository
或者应该从某些服务中获取用户(禁止在模块之外使用repo),但这会导致包装re
在DDD中使用工厂的正确方法或建议方法是什么
工厂方法应该从应用程序服务接收所有必要的参数,还是允许我们在工厂内注入存储库并提取所需的数据
如果是(示例1):
公共类UserTokenFactory:IUserTokenFactory
{
IUserTypeResourceRepository\u userTypeResourceRepository;
公共UserTokenFactory(IUserTypeResourceRepository userTypeResourceRepositor
正如DDD从业者所建议的那样,业务规则的验证必须在域对象(实体、值对象和域服务)内部实现,并遵循它们自己的上下文,我也读过,我们应该在某个地方进行技术验证(例如检查长度、正确的输入格式、正确的数据类型……)域外模型和类似应用程序层的地方,以保持域对象清晰
现在
我的问题是:
如果我们有一个信用卡号的价值对象,我们是否应该将技术验证排除在价值对象之外?
换句话说,“自我验证”一词在我们处理价值对象时不涉及技术验证
当一个不正确的借记卡号码,甚至是一个电子邮件地址有可能违反商业规则时,那该怎么办
为
我们正在将解决方案重构为领域驱动的设计结构。我们的实施软件的顾问应该能够定制应用程序的某些行为(针对特定的客户需求)。例如,他们希望将自定义属性添加到演示文稿(用户输入表单),并将自定义数据与DDD项目中定义的实体一起保存
但是,域对象最好不包含customData属性。我不想把这些混合起来,让域对象知道有一些类似于自定义数据的东西。我正在通过存储库保存和获取实体
我如何使这种情况成为可能?一种可能的解决办法是:
使用他的存储库查询实体
并按实体ID分别查询CustomPropertiesRe
我是新来的传奇人物
下面是一个简单的场景:
用户单击“创建订单”:创建订单(保持其状态=首次新建)
用户填写完订单后,单击保存-->状态现在已提交
当另一方检查订单并对其进行验证时,必须执行一个流程。只有在调用其他一些服务并发出指令时,订单才会生效
整个工作流是:
新建->已提交
从SUBMITTED中,用户可以取消is提交,并将订单切换回NEW
验证可以将订单状态设置为已验证或已拒绝
如果被拒绝,原始用户必须在再次验证之前修复其订单
因此,我需要避免在进行验证时,订单可以回滚到NEW
我的
我刚从ES/DDD开始,我有一个问题,在这个体系结构中应该如何做报告。让我们举一个典型的例子,其中客户聚合、订单聚合和产品聚合都是独立的
现在,如果我想在所有3个聚合和/或服务上运行一个查询,但这些数据都在一个单独的数据库中,可能一个是SQL,一个是MongoDB,还有一个是其他什么。如何设计或能够运行需要跨这些聚合连接的查询 领域驱动设计更关注事物的命令端。您不应该试图查询您的域,因为这会导致痛苦和痛苦
每个有界上下文可能都有自己的数据存储,并且该数据存储可能是一种不同的技术,如您所述
对于报
正如我所读到的,有两种模式可以定义一个微服务,by和by。但我仍然觉得它很模棱两可。我弄不清楚这两种模式是如何区别的。它们都围绕着涉及业务逻辑领域的活动展开。每个服务中的所有组件都足够小,可以相互打包,而不会影响其他服务。有谁能给我进一步解释一下这两个问题吗?评论者是对的,这里有一些主观的定义。但是有一些原则和概念可以帮助我们对不同的方法进行推理
康威定律
严格来说,这不是最初的定义,但我认为可以通过以下方面更好地理解这一区别:
任何设计系统(广义定义)的组织都将产生一个设计,其结构是该组织通信
我浏览了一些用各种不同通用语言编写的流行事件源框架。我得到的印象是,它们都在很大程度上影响了领域模型。据我所知,ES只是一个基础设施问题——一种保持聚合状态的方式。当然,它有助于消息驱动的上下文间集成,但从核心领域的角度来看,这是可以忽略不计的。我认为命令和事件是域本身的一部分,因此聚合可以创建事件(但不发布它们)或处理命令。p>
问题是,所有DDD构建块都会受到ES框架的污染。事件必须从某个基类继承。聚合至少应该实现外部接口。我想知道域模型是否应该知道在应用程序中使用ES方法。在我看来,即使提
我发现了两个崩溃的问题:
你应该用同样的语言
在领域专家和
开发团队DDD
你应该
在代码中使用英语命名
.Net设计指南
如果领域专家不会说英语怎么办
团队之间使用相同的语言将促进理解。然而,DDD项是指文字语言还是术语?
使用英语编码是一种建议,而不是要求。
只要您的开发团队能够翻译代码操作/意图,我就看不出问题所在。
如果你问我,你应该使用母语的业务,如客户,订单等和英语的技术术语,如得到,设置等。
如果你开始翻译你的商业词汇,你必须经过一个心理步骤,而且有时你会得到两种不同的翻译,换言之
直接或仅通过聚合根更新聚合根的子级是最佳做法吗?例如,首选哪一种:
Order.UpdateOrderLineQuantity(orderLine, quantity);
或
本部门的任何指导都将不胜感激。聚合根是封装相关子对象的对象,因此您应该使用第一种技术
调用方不应该关心订单ID是否存储为整数或字节数组,同样,他们也不应该关心或知道它是否使用OrderLines或hiddeoslegacyobjects来存储和操作订单详细信息。这对于add是有意义的,但我主要关心的是已经是订单一部分的行
埃里克·埃文斯(Eric Evans)将实体定义为“一个基本上不是由其属性定义的对象,而是由连续性和同一性线程定义的对象”。连续性线程是否意味着实体必须存储到数据库中才能在应用程序中生存?通常,实体存储在某个地方,主要通过存储库检索
然而,Evan的意思是,实体必须在建模世界中具有其身份和连续性。我可以想象这样一种情况:实体来自应用程序外部,然后转到其他地方,您甚至可以跳过数据库,但它仍然是实体,而您可以在下次它出现时识别它。其他实体仍然可以通过持有其id来引用它。在其生命周期中保持稳定/不变/
让我们以一个简单的“帐户注册”为例,流程如下:
用户访问网站
点击“注册”按钮填写表格,点击“保存”按钮
MVC控制器:通过读取ReadModel验证用户名唯一性
RegisterCommand:再次验证用户名唯一性(问题在于此)
当然,我们可以通过读取MVC控制器中的ReadModel来验证用户名唯一性,从而提高性能和用户体验。但是,我们仍然需要在RegisterCommand中再次验证唯一性,显然,我们不应该在命令中访问ReadModel
如果我们不使用事件源,我们可以查询域模型,所以这
引用自(第150页)
(a)
对值的全局搜索访问通常是有意义的,因为查找
属性的值相当于创建一个新实例
具有这些属性。也有例外。例如,当我
在网上计划旅行时,我有时会保存一些可能的行程
然后稍后返回以选择要预订的项目。这些行程是有价值的
(如果有两个航班是由相同的航班组成的,我不在乎哪个航班
是哪个),但它们与我的用户名和
为我找回的完好无损
我不理解作者的推理,为什么让ItinieraryValue对象全局可访问更合适,而不是客户端必须全局搜索Customer root实体,然后从它遍历到此I
我正试着用格雷格·杨的风格来左右我的头脑
关于如何使用CQRS+EventSourcing实现DDDD有很多讨论,并且有一些示例实现。。。总的来说,这会让人很困惑
在Gregs视图中,聚合没有getter或setter——只是发出相应事件的状态更改方法
基本上,一个事件描述了过去发生的状态转换。它的数据描述了发生了什么变化
有人说,这些数据可以通过其他数据“丰富”
这些附加数据从哪里来
i、 e.我有用户和用户组-两个聚合根(可以独立存在,具有身份)User有一个名为AddToUsergroup
我见过ORM使用一个工作单元在一个步骤中提交多个存储库
我还看到了DDD和通过存储库保存的聚合根的使用,当使用事件存储持久性在概念上变得非常容易理解时
我总是需要编写数据访问代码,虽然我熟悉ORM,但我对领域驱动的设计和事件源还不熟悉-事件源非常好,但有很多基础设施
最后,我想介绍一些规则,以帮助决定何时DDD+ES比CRUD系统更值得付出额外的努力(代码大小、数据库实体的数量)
以下是我的问题:
我没有看到聚合根合并到单个工作单元中,这是避免的吗?如果是,这会导致什么问题
在DDD中,客户实体
我考虑的是本文()中描述的面向DDD的微服务体系结构。但我对数据访问和实体存在疑问
将域实体和数据访问放在一个公共项目中,甚至放在一块金块中,对我来说有意义吗?因为我想我会为每个服务多次重写相同的数据访问;DR:没有
微服务应该使用API相互通信
原因有二:
微服务作为聚合根定义了清晰的事务边界。重用代码意味着潜在地采取一种捷径,避开先决条件、后决条件和不变检查
其次,代码共享迫使您将对模型的更改与所有依赖的微服务集成在一起,这可能会破坏采用微服务的目的。拥有不同的API版本将帮助您逐步管理它
开放主机服务是上下文之间映射的一种方式,适用于通过API公开访问的情况。什么是表示上下文之间映射的好方法,您打算在其中发布/使用域事件?当系统中发生域事件时,如何跨有界上下文进行交互
通过事件进行交互是开发应用程序的一种非常强大的方式。一旦你习惯了这一点,你会觉得在系统内部和系统之间根据业务需求进行交互非常简单和方便
让我们假设你有两个有界上下文上下文A和上下文B。在有界上下文-A中,基于域模型中的某些业务逻辑,您希望通知另一个有界上下文-B采取某些操作
在这种情况下,在域模型中执行业务逻辑之后
据我所知,所有DDD实体都应该有一个ID。所以我的问题是在主-详细关系中,比如说产品和产品详细信息,产品详细信息是否应该了解该产品?是否需要在ProductDetail类中使用ProductID属性?在数据库中,这当然是正常的,因为这是链接两个对象的唯一方法,但这是DDD中的最佳实践吗?我使用Linq2Sql作为ORM映射器,所以这是一个给定的方法,但我认为这不是正确的方法。有谁对此有一些智慧吗?外键是关系数据模型的工件。对象模型使用容器的概念进行操作。因此,订单包含订单行的集合。订单行包含产品
我最近学习了DDD,我们通常将创建、更新和删除封装到存储库中,以将更改持久化到数据库中
使用ORM工具,我们可以忽略持久性的细节,通常存储库的参数是聚合根对象,ORM执行持久性的转换(例如,如果只有一个更改,它将更新一个字段)
但若并没有ORM,只有聚合根对象的一个字段被更改并保存到DB,那个么如何为存储库设计这个字段呢?是否支持保存此字段的方法?有一个名为update的方法可以保存所有属性,但使用它会导致性能问题。通常您需要另一个存储库。如何实施取决于您。
您可以编写代码,以便在单个字段发生更
我有一个两层应用程序,底层用于从外部API收集数据并将其添加到数据库,第二层用于从数据库返回数据,该数据基于我从外部API调用收集的数据。
因此,我设法将外部API调用与域中的接口一起放入基础结构存储库中。
因此,通常我遇到的困难是将收集的数据保存在数据库中,而不在域中为这些数据创建模型,因为这些数据在外部API上是可靠的。我希望这两个层完全分离,收集数据并返回其他数据,而不违反领域驱动设计。我将在这里尝试回答的是DDD如何提供帮助,并强调在应用DDD原则找到有用的设计和适当的实现之后,导入是一
我目前正在尝试学习一些新的编程模式,我决定尝试一下事件源
我已决定将仓库建模为装运/库存领域中的聚合根,其中仓库数量通常相当恒定,即公司不会太频繁地添加仓库
我遇到了如何在服务器上设置aggregateId的问题,aggregateId应该对应于仓库。我看到的大多数示例(包括)都显示了在创建新聚合(在我的示例中为仓库)时,在服务器端生成聚合ID,然后在为后续命令引用该聚合时传入命令请求
你认为这是正确的方法吗?我可以期望用户在发出命令时知道并传递聚合ID吗?我意识到这可能与域有关,也可能是UI/
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 41 页