【问题标题】:Separating persistence model and domain model分离持久性模型和领域模型
【发布时间】:2019-08-02 08:58:18
【问题描述】:

终于开始掌握领域驱动设计的窍门,在我看来,将持久性模型 (PM) 与领域模型 (DM) 分开是有意义的。

  • DM 包含工厂函数
  • DM 包含在工厂函数中触发的事件
  • DM 是不可变的(只能通过工厂创建)

由于从 PM 到 DM 的映射应该在存储库中完成,并且 DM 应该是不可变并且不知道 PM,我是否应该只创建一个接受所有参数但现在调用的工厂函数事件?

服务层使用工厂函数将 DTO 转换为 DM,然后在任务完成时映射回 DTO。

或者用简单的方法在 DM 中创建一个以 PM 作为参数的工厂函数,反之亦然?

我的解决方案是:从 DDD 中交换一些纯度和清晰性,以使设计更高效并降低复杂性。

【问题讨论】:

  • 这个问题不适合 Stack Overflow,因为它太宽泛且基于观点。
  • 如果 Stack Overflow 帮不上忙,谁能...
  • 我不知道,但就是这样,问题必须符合一定的标准,见How to Ask
  • 嗯,谢谢你的努力。认为我会放弃一些纯洁,如所说。

标签: c# entity-framework domain-driven-design n-tier-architecture


【解决方案1】:

服务层了解所涉及的所有层:DTO、DM、PM 和存储库,因此它是进行各种转换的最佳场所。

在典型流程中,假设您正在执行 API 调用,您会:

  • 根据请求参数构造 DTO
  • 通过将 DTO 转移到域模型中的工厂方法来构造域模型
  • 将新的域模型传递到存储库以实现持久性(DM-to-PM 和 PM-to-DM 方法在存储库中)
  • 将持久化的域模型转换为 DTO 以运回外层

【讨论】:

  • 谢谢大佬,我也想过同样的顺序,只是想提点意见。
  • 由于 C#,必须将域模型、持久性和存储库放在同一个库中。
  • 但是当 DM 不可变时,我将如何从 PM 构造 DM?我应该在 DM 中创建一个接受 PM 作为参数并且不触发任何事件的工厂函数吗?您对此有何看法?
  • PM 到 DM 的转换是存储库的责任。存储库可能包含像 to_entityfrom_entity 这样的方法来帮助进行这些转换。
  • 另外,你的观点提出了除了构造函数之外需要有一个单独的工厂方法来初始化新的域对象。构造函数应该只用于重构对象,通常来自数据存储,并且不应该包含业务验证。工厂方法是处理这些不变量和构造有效对象的地方。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2022-01-15
  • 2018-08-30
  • 2012-12-18
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多