- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在 DDD ( Domain-driven design) 领域尝试我的第一步。我喜欢这个明智的规则,你应该将你的实体分成许多更小的、特定于上下文的实体(例如 User
实体几乎在每个非 ddd 或设计不佳的应用程序中都会过度增长)。但是,关于如何使用 Doctrine 在 php 中(有效地)执行此操作的常见选项是什么?
假设我有两个限界上下文:Store
和 Invoicing
他们每个人都有两个领域实体:对于 Store BC,它是 FirstTimeCustomer
和 RecurrentCustomer
对于 Invoicing BC,它是 VatCustomer
和 NonVatCustomer
现在,在我的基础架构层中,我希望将它们全部保存在同一个(至少是基表)表中,以便能够通过通用 UserId
(Uuid) 引用它们。对我来说,问题是如何做到这一点,这样我就可以在我的存储库实现中利用学说自动映射的优势。
我阅读了单表继承或 Class Table Inheritance这可能是解决方案,但是:
我需要能够使用相同 Uuid 的 User
,因为它在每个上下文中都是不同的类型。
我需要能够在 $storeCustomerRepository->find(1) 上返回一些
在商店 BC 中。 AbstractStoreCustomer
又名 FirstTimeCustomer
或 RecurrentCustomer
;
并在 $invoicingCustomerRepository->find(1);
上返回一些 AbstractInvoicingCustomer
又名 VatCustomer
或 NonVatCustomer
在开票 BC 中。
但似乎我被迫在这里选择我想要绑定(bind)实体的特定标识的 BC。所以它在 DDD 的上下文中对我来说根本没有意义。
我还阅读了 Mapped Superclasses ,这看起来也是一个选项,但是:
This means that One-To-Many associations are not possible on a mapped superclass at all.
我需要 Customer
与订单相关,这应该在两个实体中都可用(也可能不希望它可用是一些新类型的 User
新 BC 中的实体)。
我得出结论,我应该怀疑我遗漏了什么,是吗?我应该如何实现将上帝实体分解成更小的上下文特定实体?
最佳答案
我将从一些通用规则开始。在考虑 DDD 时,您必须拒绝任何关于持久性(表和主键等)的想法。您必须像将它们存储在文件中一样设计聚合根和实体。当你设计模型时,如果你想到表或 ORM,你就没有做 DDD;退后一步,重新开始。
如我所见,您通过按限界上下文拆分模型开始了 OK。如果你不按 BC 拆分它们,你最终会得到试图包含所有行为的巨大模型,然后持久性将影响性能,因为在 DDD 中,聚合在一个事务中持久化。另一件事,尽量避免继承并使用组合。
话虽如此,让我们谈谈您的业务。在 Authentication
BC 中,Users
可以使用一些凭据进行身份验证。在 Store
BC 中有 Customers
购买东西。在 Invoice
BC 中,还有 Customers
,但模型不同(如果需要,可以是不同的类)。在 Shipping
BC 中也有 Customers
但同样是不同的模型。这些 Customer
模型沿 BC 共享一些属性,例如 name
和 id
。因此,您使用 id
来识别现实生活中的人,但根据上下文使用不同的模型来封装他们的行为。
我认为你不应该有一个 AbstractStoreCustomer
,你应该只有 Customer
并尝试在抽象类/接口(interface)中隔离它们的区别,比如 BuyingHistoryProfile
有 2 个实现 FirstTimeCustomer
和 RecurrentCustomer
。此类应该只包含有关购买配置文件的行为,它应该被 Store
BC 中的每个 Customer
引用。类似地,尝试在 Invoicing
BC 中提取一个类用于价格计算。
现在我们已经创建了模型,我们可以考虑持久性了。为每个有界上下文创建一个 Customer
表,其中包含共享属性(name
和 id
)和特定属性(buyingHistoryProfile
用于 Store
BC,priceCalculationStrategy
用于 Invoicing
BC 等)。
如果您想知道存在一定程度的数据重复,那么您是对的,但这是正常的,有必要将模型解耦。当 Authentication
BC 中的 User
更改其名称时,此重复数据会同步:您会立即更新所有其他模型。从这个角度看,Invoice
和Store
BC是下游,它们使用的数据来自Authentication
BC;何时启动更新取决于您的业务。
作为事件驱动架构的粉丝,我建议您看一下 CQRS(甚至事件溯源)。我认为这些架构非常适合这个应用程序。 CQRS 可以使您的模型清洁 10 倍,我根据我的经验告诉您。使用事件溯源,您很可能甚至不必使用 ORM
。您可以在读取端使用 ORM
,如果您真的喜欢它们或者您不能离开它们。我个人不喜欢(也不使用)ORM
。
关于php - 如何在不同的限界上下文中将学说实体拆分为更多领域实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42217476/
这个问题在这里已经有了答案: How to initialize var? (11 个答案) 关闭 8 年前。 我想给一个变量赋初值 null,并在下一个 if-else block 中赋值,但是编
我正在使用 TypeScript 3.8 编写 JS 和 TS 混合的代码。我写了以下行: export * as Easing from './easing'; 应该是 fair game在 Typ
我需要将 R 代码中的“/”更改为“\”。我有这样的事情: tmp <- paste(getwd(),"tmp.xls",sep="/") 所以我的 tmp是 c:/Study/tmp.xls 我希望
我有个问题。例如我有这个: id truth count 1 1 1 2 1 2 3 0 0 4 1 1 5 1 2 6 1
我正在尝试使用“IN”和“=”来查找一些 bean。我目前正在使用此代码: $ids = array(1,2,3,4); $user = 1; $things = R::find( 'thing'
是否可以在 Xcode 中部署到其他人的手机上?我没有 iPhone,但我想测试我在 friend 手机上制作的应用程序。在我支付 99 美元之前,我想确保这不会造成麻烦。 谢谢。 最佳答案 不会有任
我试图得到一个非常大的数字(超过 unsigned long long int )。所以我把它作为一个字符串,然后一个数字一个数字地转换成整数并使用它。 #include #include int
我在 Rust 中有 C 语言库的绑定(bind),但它们并不完整。 在 C 代码中,我定义了一个简化的宏,如下所示: #define MY_MACROS1(PTR) (((my_struct1
我正在努力解决这个问题。 http://jsfiddle.net/yhcqfy44/ 动画应该自动相对于 滚动到顶部每次出现滚动条时的高度。 我已经写了这个,但没有运气: var hheight =
我正在处理一个将数字作为字符串返回的 JSON API。例如 "12" ,但是,该字段值也可以是非数字的,例如:"-" . 我已将 JSON 数据解析为映射,我想将此字段提取为 elixir 中的整数
我正在尝试编写一个类,将.wav文件转换为.aiff文件作为项目的一部分。 我遇到了几个库Alvas.Audio(http://alvas.net/alvas.audio,overview.aspx)
我想在 Lucene 中将像“New York”这样的“复合词”索引为单个术语,而不是像“new”、“york”那样。这样,如果有人搜索“new place”,则包含“new york”的文档将不会匹
我希望这个解释能让我更好地了解使用宏的优点。 最佳答案 在函数中,所有参数在调用之前都会被评估。 这意味着 or 作为函数不能是惰性的,而宏可以将 or 重写为 if 语句,该语句仅在以下情况下计算分
我有一些看起来像这样的 XML foo ]]> (注意 > 登录 "> foo")和 XSLT 样式表 当我运行xsltproc stylesheet.xs
当我尝试将 Any 转换为 List 时,如下面的示例所示,我得到“Unchecked cast: Any!”到列表'警告。有没有解决此类问题的方法? val x: List = objectOfTy
我正在使用 Python 开发一个简单的爬虫。目的是创建一个 sitemap.xml。(你可以在这里找到真正的 alpha 版本:http://code.google.com/p/sitemappy/
我想知道在 VBScript 中是否可以在多行中中断 If 语句。喜欢: If (UCase(Trim(objSheet.Cells(i, a).Value)) = "YES") Or _ (UCas
for (String item : someList) { System.out.println(item); } 使用“do while”是否等效? 谢谢。 最佳答案 如果列表为空,f
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Split string with delimiters in C 在 C 中将“,”分隔的列表拆分为数组的最佳方法
我有一个如下所示的字符数组: [0, 10, 20, 30, 670] 如何将此字符串转换为整数数组? 这是我的数组 int i=0; size_t dim = 1; char* array = (c
我是一名优秀的程序员,十分优秀!