【问题标题】:Golang DDD implementation of dependent modulesGolang DDD 实现依赖模块
【发布时间】:2016-09-15 01:28:18
【问题描述】:

我正在尝试为我的应用程序模块实现 DDD 架构,但遇到了在它们之间存储相似(依赖)结构的问题。

在第一个包中,我存储与实体人员相关的所有内容:服务(存储库)、控制器、模型等...

在第二个包中,我存储了与另一个实体 Apartments 相关的所有内容:服务(存储库)、控制器、模型等......

每个Apartment可以包含多个Tenants,这些Tenants以与People相同的结构存储在数据库中。

一些Apartment包服务应该能够调用get/update/...等方法Tenants。我很乐意不重新实现这些操作并从 PeoplePeopleService 中的实现中使用它们,但该服务返回 People 实体,而不是租户

我是否应该在 Apartment 包中创建 People 的附加结构(复制粘贴整个源代码),将其命名为 Tenant 并转换返回PeopleService 的种类呢?

或者有其他方法吗?

另外,我应该在哪里存储具体实体的服务/存储库接口(与 CRUD 类似的方法的接口)? PeopleService 接口应该同时在 PeopleApartment 包中吗?

谢谢。

【问题讨论】:

  • DDD 不是架构。 DDD 与 CRUD 无关。如果您可以跨实体和服务复制粘贴代码,那么您正在处理 CRUD,并且您根本不需要 DDD 和域模型。获取 CRUD 应用程序生成器并完成此操作。

标签: go interface architecture domain-driven-design


【解决方案1】:

可能有不同的方法,坦率地说,这个问题可能应该因为过于宽泛和基于意见而结束。

我可能会这样做:

  1. 在单独的包中解耦所有链接模型models

  2. 对 People->Tenants 使用组合,例如 type Person { Name string } type Tenant struct { Person }

  3. 问候人公寓 - 创建一个包tenants,它将与人和公寓的模型和服务一起运行。

【讨论】:

  • 感谢您的回答!是的,问题可能真的太笼统了。我只是认为将模型解耦到单独的包似乎不像 DDD 方式......我已经使用过组合,但它对代码冗余没有帮助:Person 模型应该在 Apartment 和 Tenant 包中。将租户与另一个包分开是一个很好的解决方案,肯定会尝试,它可以向人(如“他的公寓”)添加额外的字段使其成为租户,但不能为公寓做同样的事情(如“它的租户” ') 因为对于 Apartment 操作,我们使用 Apartment 包。
  • 你不能同时拥有独立性和双向意识。公寓可能不需要知道有关租户的任何信息,而只需要 id 列表。然后你可以做一些事情tenants.GetByIDs(apartment.CurrentTenantIDs)。对答案的支持就像“谢谢”一样好;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2021-06-05
  • 2023-03-31
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多