如何使用类组合加载数据?

时间:2010-09-03 09:22:49

标签: c# oop persistence lazy-loading composition

以下是我的课程:

class PriceScale
-int ID
-float bookingFees
-Product product
-List<PricePeriod> periods

Class Product
-int ID
-string name
-List<PriceScale> priceScales

class PricePeriod
-DateTime begin
-DateTime end
-float price
-PriceScale scale

正如您所看到的,我严格应用业务规则“产品价格多,价格规模有很多时期”。

我的问题:例如,当我处理Product类时,我不想问自己“是否加载了priceScales?” (因为我每次需要产品时都不会加载它)

解决方案:

1 /延迟加载:我不喜欢它,因为你甚至不知道它就运行sql查询,你最终会遇到1 + n查询问题(我正在研究价格计算系统,所以我真的需要确定执行了哪个sql查询)

2 /总是加载它:我不喜欢它,因为如果我将这个逻辑应用于我将最终加载整个数据库的所有内容。

3 /删除组合(即会员价格标准),在这种情况下,处理价格规模的最佳方式是什么:

  • 获取Dictionnary&lt; int,List&lt; PriceScales&gt;&gt;密钥是产品ID?

  • 别的什么?

4 /在我的方法开头添加我需要priceScales

checkPriceScalesAreLoaded(productList);

它看起来像延迟加载,但它更明确。

5 /我甚至没有想到的其他事情:)

由于

2 个答案:

答案 0 :(得分:0)

对我而言,这听起来像是一个持久性问题,与OOP或组合并不完全相关。

您是否从数据库加载对象?如果是这样,您使用的语言和持久性机制是什么?这很大程度上影响了可能的解决方案。

例如,对于Java和Hibernate,推荐的方法是使用默认的延迟提取策略,然后根据需要测量性能和微调(在本地选择性地切换提取策略)。您可以切换到单个映射/属性/查询的急切提取或批处理/连接查询,同时保持其余的延迟提取策略。

答案 1 :(得分:0)