可重复使用的复杂读取模型

Reusable complex read model

在我的组织中,我们有一张包含许多不同属性的复杂产品卡。我可以使用 Steam 产品卡片来形象化我在说什么:http://store.steampowered.com/app/219740/(PS:很棒的游戏,检查它)。

产品卡片表示由 titledescriptionprice 等属性和 screenshotsreviewsratings 等关联组成, tags 等 产品段用于应用程序的不同部分 - 例如,您可以在用户库中找到标签列表(您不需要屏幕截图)。

你会如何构建阅读模型? a) 尝试创建小型通用视图模型(ScreenshotTag)并将它们组合到具体视图中(ProductCardUserLibrary)? b) 创建一个包含与产品相关的每个 属性 的上帝 Product 视图模型? (性能方面 - 听起来不太好) c) 为每个视图创建 属性 定制的视图模型?如果是这样,如果我必须在整个应用程序中重复使用某些特定部分(产品名称、价格等),我该如何避免代码重复(我们在每个页面上都使用产品的某些部分)? d) ?

我不能将事件侦听器用作投影仪,因为产品状态是通过我们无法修改的遗留 CRUD 应用程序更改的 - 我们依赖共享数据库。

为什么要避免代码重复?或者更具体地说,为什么要在不同的限界上下文中避免代码重复;)...如果仅基于避免代码重复来创建依赖项,则会创建错误的抽象(与有效用例无关)。

我会引用 Sandi Metz 的话:

duplication is far cheaper than the wrong abstraction

prefer duplication over the wrong abstraction

Find more here about wrong abstraction

答案是...

Create property tailored view models for each view

为什么?因为它是 最简单且最易于维护的 解决方案。在阅读上下文中,您只是在处理 read-only 数据。您不需要封装或粒度表示('Screenshot' 或 'Tag' 的特定模型)。这并不意味着您不能重用任何其他视图模型,如果您已经拥有它们并且它们具有相同的数据,但这里的主要原则是创建一个视图模型以仅服务于特定视图。

在此上下文中不存在重复,因为 DRY 指的是(相同上下文)行为而不是数据。