首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有界上下文实现与设计

有界上下文实现与设计
EN

Stack Overflow用户
提问于 2014-02-06 07:03:04
回答 2查看 2.2K关注 0票数 12

假设我有两个有界的上下文,航运上下文和计费上下文。这些上下文中的每一个都需要了解客户。

在数据级别,客户由数据库中的CustomerTbl表表示。此表由描述客户的所有必要列组成。

CustomerTbl中的列(简化):

  • Name
  • PhysicalAddress
  • PaymentMethod

船运上下文涉及NamePhysicalAddress,而计费上下文涉及NamePaymentMethod

在航运上下文中,我对聚合Recipient进行了建模

  • Recipient现在有了NamePhysicalAddress的属性/值对象

在计费上下文中,我对聚合Payer进行了建模

  • Payer具有NamePaymentMethod的属性/值对象

RecipientPayer聚合体都由上下文边界完全分离。他们也有自己的资料库。

问题:

  1. 使用相同的“数据库表”拥有多个聚合(前提是它们在单独的有界上下文中)是否可以接受?
  2. 在更多有限制的情况下,可能需要客户数据。这不意味着每个有限制的上下文都有许多聚合、存储库和工厂实现吗?代码中将存在一定程度的冗余。这不影响可维护性吗?
  3. 跨聚合具有共享属性是可以接受的吗?一个例子是customer Name属性。这也意味着冗余验证代码?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-07 06:48:50

问与答

( 1)使用相同的“数据库表”拥有多个聚合(前提是它们在不同的有界上下文中)是否可以接受?

  • 只要您遵循管理共享状态的严格策略,我就可以接受它。
  • DDD是可以接受的,因为域被认为比数据更重要。
  • 这是可以接受的,你的客户,只要它完成工作,而不引入(太多)隐藏成本。

2)在更多有限制的情况下,可能需要客户数据。这不意味着每个有限制的上下文都有许多聚合、存储库和工厂实现吗?代码中将存在一定程度的冗余。这不影响可维护性吗?

不一定要看一下shared kernel pattern

3)拥有跨聚合的共享属性是否可以接受?一个例子是customer属性。这也意味着冗余验证代码?

与问题1一样,关于冗余,一旦有了共享内核,您就可以简单地将验证器类放在其中。

关于你在干爽和DDD之间的冲突:

优雅的代码并不会不必要地使伟大的设计原则相互冲突。通常有一种满足原则的方法。你只是还没有找到它,因为要么你对原则不够了解,要么你没有充分剖析你的问题。

(如果这听起来是教条的话,那是因为软件工程实际上是一种宗教)

票数 9
EN

Stack Overflow用户

发布于 2014-02-07 04:26:44

答案:

1.如果聚合体及其存储库是只读的,则为是。如果在没有通知其他上下文的情况下单独更改模式或数据,那么在有界上下文之间共享存储和模式可能是一个问题,但我认为在这种情况下这不是一个大问题。

但如果收款人和付款人是可编辑的,则情况就不同了。很可能有人可以修改它们,这会在有限制的上下文中产生影响。例如,客户可能需要更改特定送货订单的地址,但是共享裁剪表可能会在没有通知的情况下更改客户发货订单的所有地址。所以最好为它们使用不同的存储空间。

2.不同的有界上下文需要客户的不同方面。我认为只依赖必要的数据是一个很好的实践,因此聚合抽象可能是不同的。潜在的可维护性问题可能发生在实现端(主要是因为重复代码)。因此,我们可以引入一个额外的组件,返回客户的所有方面,并在其上构建有限制的上下文特定适配器。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21596187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档