如何在域对象中存储业务逻辑?

时间:2012-05-12 04:16:17

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

有几种方法可以实现您的目标。您在描述中多次提到“View-Model”一词,这让我觉得您正在尝试使用设计模式“MVVM”(Model-View-ViewModel),这在使用WPF或Silverlight技术时非常流行它支持对视图进行数据绑定,但也可以扩展到其他技术。

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

模型本质上是您的域名,仅用于特定于域的建模。您的应用程序实体应该在此处,但不应该对域实体进行计算或操作。例如。如果它是一个自行车领域,你的'自行车'和'骑士'课程应该住在这里,但是应该没有关于计算比赛获胜者的代码,或者在你的应用程序GUI中显示获胜者的颜色。

视图模型是您准备要在View(用户界面)中显示的域实体的地方。您通过将域实体包装到新类中来实现此目的,这些类在构造函数中获取域对象,但随后将现有属性公开或转换为您希望在视图中显示的属性。在循环类比中,您的Bike对象可能具有Make,Model,Cost,RRP,TimeBuilt属性,因此在视图模型中我将公开Make,Model属性,但随后翻译 Cost和RRP以及提出零售价的余量(如前端所示)。

查看,您可能已经猜到了这些信息的显示位置。这可能是桌面,移动或网络前端 - 它并不重要。这也是应该实现UI的任何渲染的地方。如果我想向我的客户强调优惠价格,并为绿色零售价格非常好的任何自行车上色 - 我会在这里做。

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

  

如果A处于'xxx','zzz'且B = 0或D&gt;,则突出显示单元格的背景。 200

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

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

答案 1 :(得分:0)

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

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

如果有帮助,请告诉我。

答案 2 :(得分:0)

术语“视图模型”是错误的。视图和模型是两个独立的事物,每个事物处理应用程序的独特/单独关注:模型封装业务逻辑,视图处理表示/显示。简单来说,模型是您的域对象。 您在示例中显示的内容与演示相关。它属于视图,而不是模型。