2014-02-15 31 views
0

我正在用兩種模型構建一個指標應用程序:度量和度量。度量標準有許多度量標準,度量標準屬於度量標準。在Ruby中進行構造函數注入時的循環依賴關係

這些模型被持久化並使用兩個映射器從數據庫中提取: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> 

爲了能夠做到這一點的MeasurementMapper實例化一個MetricMapper:

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,這意味着我們現在有一個循環依賴。

如何更改我的設計以刪除此循環依賴項而不使其中一個類意識到其他類?

+0

你看過[Ruby on Rails](http://rubyonrails.org)嗎?這種事情是由RoR直接處理的。基本上看起來不需要單獨的Mapper類。最終,一對多關係通過Measurements表中的一個'metric_id'列建模,對吧?如果您不使用RoR,則在每個Measurement and Metric類中編寫關聯方法。這兩個階級自然知道對方。 – Matt

+0

單獨的Mapper類背後的想法是讓模型本身不知道它們是如何被持久化的。這樣做的一個好處是,我可以在不影響實際模型內部封裝的計算邏輯的情況下嘗試不同的持久性模型。模型彼此瞭解,但不知道如何堅持。 –

回答