domain-driven-design - 标题、标签和其他与 UI 相关的东西是否应该包含在域模型中?
问题描述
我对如何严格处理与 UI 相关的事情感到困惑,这些事情不会在领域模型的业务逻辑中使用:如何正确地将它们存储在数据库中?
例如,如果我有一个作为实体的聚合,并且该模型的主要目的是处理重要的事情,我是否应该在模型中包含一个标题,即使它对业务逻辑没有任何贡献?如果我想将标题存储在为我的实体存储其他数据(例如重要的事情)的同一个表中,这有关系吗?
@Entity
MyAggregate:
id: ID
title: str
importantThing: ImportantThing
def doSomethingWithImportantThing():
...
如果我没有在模型中包含标题,那么如何使用Repository
模式正确存储它?如果我将标题保留在我的模型中,我的存储库可能如下所示:
@Repository
MyAggregateRepository:
def create(myAggregate: MyAggregate):
...
如果我从模型中删除标题,存储库会发生什么情况?它应该像这样转换:
@Repository
MyAggregateRepository:
def create(myAggregate: MyAggregate, title: str):
...
解决方案
经验法则是只保留在聚合状态中做出决策和保护不变量所必需的东西。否则,聚合会受到外来问题的污染,并转换为过度增长的数据库表或文档的混乱的一对一表示。
作为任何规则,它有例外。我认为从一开始就过火并过早拆分实体并不是一个好主意。
但是,如果您觉得事情变得一团糟,并且您可以看到一组字段在一组函数中使用的模式,而另一组字段仅在一组不同的函数中使用,您可能会认为您的聚合值得分裂。
存储库模式在很大程度上与执行命令相关。它的主要目的是处理聚合持久性。实现查询时,请考虑使用 CQRS 并编写您需要编写的查询,它不必是处理查询的存储库。查询也是幂等的并且没有副作用(性能除外),因此在编写查询时不要考虑域模型是相当安全的。不过,最好使用通用语言来命名您的查询。
推荐阅读
- javascript - 如何在谷歌应用脚本中使用节点 js(缓冲区)
- python - django - 使用 mock 测试 django-admin 命令
- lua - 没有找到 'bit' 的 LuaRocks 模块
- c++ - 播种独立位引擎,提高多精度
- c# - 它不会从 c# 返回行存储
- google-sheets - Google 表格 - 最接近值的条件格式
- javascript - 如何在不复制的情况下修改数组,代码不应该使用任何额外的空间并且应该尽可能高效?
- testing - 我们可以在 browserStack 上运行/测试桌面应用程序吗?
- unicode - CFF 字体文件中的编码和字符集表是如何组织的?
- java - Java、LeetCode 和 Nulls:Leetcode 编译器如何处理空值?