在Ruby中进行构造函数注入时的循环依赖关系

时间:2014-02-15 16:37:54

标签: ruby oop design-patterns dependency-injection

我正在使用两种模型构建度量标准应用程序:度量标准和度量标准。度量标准包含许多度量标准,度量标准属于度量标准。

这些模型使用两个映射器持久化并从数据库中获取:MetricMapper和MeasurementMapper。这些类被实例化并声明像#find和#save这样的方法。

为了使我的代码库尽可能模块化,我使用构造函数注入为这些映射器提供依赖项:

db = ...
metric_mapper = MetricMapper.new(db: db)

MeasurementMapper#find方法可以选择同时加载测量指标:

measurement = measurement_mapper.find("some_id", load_metric: true)
measurement.metric #=> <Metric>

为了能够做到这一点,使用MetricMapper实例化MeasurementMapper:

db = ...
metric_mapper = MetricMapper.new(db: db)
measurement_mapper = MeasurementMapper.new(db: db,
                                           metric_mapper: metric_mapper)

这一切都很好,效果很好。当我希望MetricMapper#find方法能够同时加载度量的相关度量时,这个设计模式的问题就开始出现了。

metric = metric_mapper.find("some_id", load_measurements: true)
metric.measurements #=> [<Measurement>, <Measurement>, ...]

为此,需要使用MeasurementMapper对MetricMapper进行实例化。问题是要实例化MeasurementMapper,我们需要一个MetricMapper,这意味着我们现在有一个循环依赖。

如何更改我的设计以删除此循环依赖项而不使其中一个类知道另一个?

1 个答案:

答案 0 :(得分:0)

我认识一个以极好的方式解决它的人! https://github.com/calleerlandsson/q/blob/master/lib/q/metric_mapper.rb#L8

相关问题