我开始抓住领域模型的想法,但有一件事我无法看到这是如何在领域模型中实现的 - 分组数据。最明显的例子是各种报告,包括或不包含动态列分组和用户指定的列顺序。
我会尝试提供具体的例子。想象一下以下域模型:
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字段“weight”。再次,只在展出。
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
为了实现这种“人工”模式,我需要改变什么?
似乎需要某种复合值对象,其中go位置:所有位置实体字段+大小字段+权重字段。我是在正确的轨道上吗?
答案 0 :(得分:0)
如果您使用NHibernate作为ORM工具,则可以使用Projection功能执行分组和聚合功能,例如“sum”和“count”。这留下了从查询返回什么实体的问题,因为您的Position实体可能不会有'weight'字段。我倾向于只有一个名为PositionQueryResult或类似东西的新实体(也许实体不是正确的单词)。与实际位置实体区别开来的东西。这个'实体'没有行为 - 只是应该返回的属性。我没有在任何地方看到这种提倡,但它对我有用。
但是,您将此称为“报告”。有一种观点认为,报告不应该包含在您的域中,它是独立的。这可能是一个非常好的范例,因为ORM更适合域模型编程,但原始SQL通常更适合报告。