1

我开始理解域模型的想法,但有一件事我看不到这是如何在域模型中实现的——分组数据。最明显的例子是各种报告,有或没有动态列分组和用户指定的列顺序。

我将尝试提供具体示例。想象一下以下领域模型:

Orders [1-to-many] Positions [1-to-many] Production items

显示为简单的 3 级列表。

Order 1
- Position 1
  - Production item 1, length: 2.5, weight: 1.234
  - Production item 2, length: 2.5, weight: 2.345
  - Production item 3, length: 5, weight: 3.456

然后要求通过从生产项目中添加“长度”字段(仅用于显示,不更改职位实体本身)来修改职位级别,并按此字段分组。

Order 1
- Position 1, length: 2.5
  - Production item 1, length: 2.5, weight: 1.234
  - Production item 2, length: 2.5, weight: 2.345
- Position 1, length: 5
  - Production item 3, length: 5, weight: 3.456

下一个要求是在职位级别从生产项目级别添加另一个 SUMmed 字段“重量”。同样,仅在展示中。

Order 1
- Position 1, length: 2.5, weight: 3.579
  - Production item 1, length: 2.5, weight: 1.234
  - Production item 2, length: 2.5, weight: 2.345
- Position 1, length: 5, weight: 3.456
  - Production item 3, length: 5, weight: 3.456

我需要改变什么来实现这个“人造”模型?

似乎需要某种复合值对象来代替位置:所有位置实体字段+大小字段+权重字段。我在正确的轨道上吗?

4

1 回答 1

0

如果您使用 NHibernate 作为 ORM 工具,则可以使用 Projection 函数来执行分组和聚合函数,例如“sum”和“count”。但是,这留下了从查询中返回什么实体的问题,因为您的 Position 实体可能没有“权重”字段。我倾向于只有一个名为 PositionQueryResult 或类似名称的新实体(也许实体不是正确的词)。与实际职位实体区分开来的东西。这个“实体”没有任何行为——只有应该返回的属性。我在任何地方都没有看到过这种做法,但它对我有用。

但是,您将此称为“报告”。一种观点认为,报告不应包含在您的域中,它是独立的。这可能是一个很好的范例,因为 ORM 更适合领域模型编程,但原始 SQL 通常更适合报告。

于 2011-12-21T10:00:11.270 回答