可重复使用的复杂读取模型
Reusable complex read model
在我的组织中,我们有一张包含许多不同属性的复杂产品卡。我可以使用 Steam 产品卡片来形象化我在说什么:http://store.steampowered.com/app/219740/(PS:很棒的游戏,检查它)。
产品卡片表示由 title
、description
、price
等属性和 screenshots
、reviews
、ratings
等关联组成, tags
等
产品段用于应用程序的不同部分 - 例如,您可以在用户库中找到标签列表(您不需要屏幕截图)。
你会如何构建阅读模型?
a) 尝试创建小型通用视图模型(Screenshot
、Tag
)并将它们组合到具体视图中(ProductCard
、UserLibrary
)?
b) 创建一个包含与产品相关的每个 属性 的上帝 Product
视图模型? (性能方面 - 听起来不太好)
c) 为每个视图创建 属性 定制的视图模型?如果是这样,如果我必须在整个应用程序中重复使用某些特定部分(产品名称、价格等),我该如何避免代码重复(我们在每个页面上都使用产品的某些部分)?
d) ?
我不能将事件侦听器用作投影仪,因为产品状态是通过我们无法修改的遗留 CRUD 应用程序更改的 - 我们依赖共享数据库。
为什么要避免代码重复?或者更具体地说,为什么要在不同的限界上下文中避免代码重复;)...如果仅基于避免代码重复来创建依赖项,则会创建错误的抽象(与有效用例无关)。
我会引用 Sandi Metz 的话:
duplication is far cheaper than the wrong abstraction
prefer duplication over the wrong abstraction
答案是...
Create property tailored view models for each view
为什么?因为它是 最简单且最易于维护的 解决方案。在阅读上下文中,您只是在处理 read-only 数据。您不需要封装或粒度表示('Screenshot' 或 'Tag' 的特定模型)。这并不意味着您不能重用任何其他视图模型,如果您已经拥有它们并且它们具有相同的数据,但这里的主要原则是创建一个视图模型以仅服务于特定视图。
在此上下文中不存在重复,因为 DRY 指的是(相同上下文)行为而不是数据。
在我的组织中,我们有一张包含许多不同属性的复杂产品卡。我可以使用 Steam 产品卡片来形象化我在说什么:http://store.steampowered.com/app/219740/(PS:很棒的游戏,检查它)。
产品卡片表示由 title
、description
、price
等属性和 screenshots
、reviews
、ratings
等关联组成, tags
等
产品段用于应用程序的不同部分 - 例如,您可以在用户库中找到标签列表(您不需要屏幕截图)。
你会如何构建阅读模型?
a) 尝试创建小型通用视图模型(Screenshot
、Tag
)并将它们组合到具体视图中(ProductCard
、UserLibrary
)?
b) 创建一个包含与产品相关的每个 属性 的上帝 Product
视图模型? (性能方面 - 听起来不太好)
c) 为每个视图创建 属性 定制的视图模型?如果是这样,如果我必须在整个应用程序中重复使用某些特定部分(产品名称、价格等),我该如何避免代码重复(我们在每个页面上都使用产品的某些部分)?
d) ?
我不能将事件侦听器用作投影仪,因为产品状态是通过我们无法修改的遗留 CRUD 应用程序更改的 - 我们依赖共享数据库。
为什么要避免代码重复?或者更具体地说,为什么要在不同的限界上下文中避免代码重复;)...如果仅基于避免代码重复来创建依赖项,则会创建错误的抽象(与有效用例无关)。
我会引用 Sandi Metz 的话:
duplication is far cheaper than the wrong abstraction
prefer duplication over the wrong abstraction
答案是...
Create property tailored view models for each view
为什么?因为它是 最简单且最易于维护的 解决方案。在阅读上下文中,您只是在处理 read-only 数据。您不需要封装或粒度表示('Screenshot' 或 'Tag' 的特定模型)。这并不意味着您不能重用任何其他视图模型,如果您已经拥有它们并且它们具有相同的数据,但这里的主要原则是创建一个视图模型以仅服务于特定视图。
在此上下文中不存在重复,因为 DRY 指的是(相同上下文)行为而不是数据。