【问题标题】:How to store business logic in domain object?如何将业务逻辑存储在域对象中?
【发布时间】:2012-05-12 04:16:17
【问题描述】:

我将显示一个视图模型的网格class M {string A, int B, float C, int D, .....}

  1. 如果数字为负数,则以红色显示。
  2. 如果A is in 'xxx', 'zzz' and B = 0 or D > 200...高亮单元格的背景
  3. 如果E > 100 and F < 0....,则将行的背景设置为灰色

这些是否被视为业务逻辑?如果有,这些逻辑放在哪里?对于(3),我猜可以在视图模型中创建一个新的只读属性?但它让 M 不再是 POJO/POCO 了吗?我读到业务逻辑应该在域对象中。域对象是否使用 POJO/POCO 实现?

是否有任何代码示例显示了业务逻辑如何存储在域对象中?

【问题讨论】:

  • 看起来像是特定于视图的逻辑。您可以将条件参数(例如 E>100 和 F
  • 同意,我也会将此逻辑放在视图上。
  • 是的,将条件参数转换为视图模型属性并在您的领域层中做出决定对我来说是个不错的选择。

标签: model-view-controller design-patterns architecture model


【解决方案1】:

有几种方法可以实现您想要做的事情。您在描述中多次提到“视图模型”一词,这让我认为您正在尝试使用设计模式“MVVM”(模型视图视图模型),这在使用 WPF 或 Silverlight 技术时很流行,因为比如它支持针对视图的数据绑定,但也可以扩展到其他技术。

在 MVVM 中,层分为模型、视图模型和视图。

模型本质上是您的领域,仅用于特定领域的建模。您的应用程序实体应该存在于此处,但不应进行计算或对域实体的操作。例如。如果它是一个自行车领域,您的“自行车”和“骑手”类应该存在于此,但不应该有与计算比赛获胜者相关的代码,或者在应用程序 GUI 中显示获胜者的颜色。

View-Model 是您准备要呈现到您的视图(用户界面)中的域实体的地方。您几乎可以通过将域实体包装到新类中来实现这一点,这些新类在构造函数中获取域对象,然后公开或将现有属性转换为您希望在视图中显示的属性。在自行车类比中,您的 Bike 对象可能具有 Make、Model、Cost、RRP、TimeBuilt 属性,因此在视图模型中我将公开 Make、Model 属性,然后翻译 Cost 和 RRP 以及得出零售价的保证金(如前端所示)。

视图,您可能已经猜到了,就是显示此信息的位置。这可能是桌面、移动或网络前端——这并不重要。这也是应该实现 UI 渲染的地方。如果我想向我的客户突出优惠,并将任何零售价格非常好的自行车涂成绿色 - 我会在这里做。

因此,当与您的示例相关时,应该在视图中实现对象显示的格式化。即使您不使用 MVVM,您也可以通过将域对象扩展 到 Wrapper 类中进行部署和操作来获得非常相似的结果。您的规则,例如

如果 A 在 'xxx'、'zzz' 且 B = 0 或 D > 200,则突出显示单元格的背景

可以在您的视图模型类上以布尔值建模,为您提供所需的效果,而不会用非特定代码污染您的域对象。

无论选择何种架构(MVC、MVP、MVVM 等),这些都是很好的开发指南,因为它们在应用程序的各层之间部署关注点分离

【讨论】:

    【解决方案2】:

    您可以将所有 3 次计算的输出存储为对象的属性,然后将计算的对象传递给您的视图。

    例如,在第 1 点渲染数字,如果它是负数。这种红色可以传递给视图。确定颜色为红色的实际计算可能发生在您的业务逻辑层中。

    如果这有帮助,请告诉我。

    【讨论】:

    • 您的意思是为每个数字属性添加一个颜色属性吗?喜欢class M {string A; int B; Color BColor; float C; Color CColor; int D, Color DColor; .....}。在视图渲染部分似乎需要一些无聊的样板代码。
    【解决方案3】:

    术语“视图模型”是错误的。 View 和 Model 是两个独立的东西,每个都处理应用程序的不同/单独的关注点:封装业务逻辑的模型,视图处理表示/显示。简单来说,模型就是你的领域对象。 您在示例中显示的内容与演示相关。属于视图,不属于模型。

    【讨论】:

    • 不在 MVVM 架构中(模型-视图-视图模型)。不过,与演示相关的内容并没有错。
    猜你喜欢
    • 2012-05-27
    • 2011-08-01
    • 2016-12-06
    • 1970-01-01
    • 2014-02-24
    • 2011-05-28
    • 2011-02-28
    • 2012-10-22
    相关资源
    最近更新 更多