2017-08-16 175 views
0

我正在使用QT,所以也許有更高級的選項或最佳實踐方法。但是,如果有一個好的,一般的C++或語言不可知的答案,那將是最棒的!正確構建和破壞注入器依賴注入對象

我試圖讓由的setter依賴注入正確的配置,並有掙扎規劃對象的生命時對象的構造和析構。

在一個German Microsoft Blog一個很好的比喻來討論對象之間的依賴關係d,責任和互動,我想適應:

有一個主園丁和學徒,園丁
主希望學徒挖掘。一開始,徒弟正在建造一把鏟子,所以他可以挖掘,但有人指責說,製造自己的鏟子對於學徒來說太過責任。

現在在第二種方法中,主人可以訪問一個漂亮的剷車工廠,生產質量可測試的鏟子。他繼續告訴學徒digWith(testableShovel)

現在二傳手Dependendy注射的方面,我先給師傅告訴徒弟takeShovel(testableShovel)二傳手),然後diggBoy()讓他掏。

問題出現了,當主人忘記告訴學徒採取鏟子,因爲現在學徒沒有工具挖掘。

爲了處理這種情況,我想知道 - 學徒在施工時是否創建了自己非常基礎的挖掘設備(如一雙手)?或者應該通過構造函數依賴注入來完成(允許構造函數和依賴注入)?創造/帶來一雙雙手要求學徒,我寧願有一個nullptr - 檢查?


現在,讓我們假設我有我的徒弟創立了自己的一雙手,誰必摧之,一旦他拿起鐵鍬的?一旦他放下鐵鍬,誰會重新創造它們?如果徒弟被放在一邊,什麼會被毀滅?

回答

1

第一個問題:如果目標對象需要注入的對象來完成它的工作,那麼它應該注入構造函數中。否則,在施工後你會使對象處於無效狀態。或者,如果您在目標中執行某些依賴關係的「基本」版本,那麼您首先會引入依賴注入試圖避免的耦合。另一方面,如果依賴關係在某種程度上是可選的(例如,在某些情況下記錄器可能被認爲是可選的),那麼setter注入就完全沒問題。其次,我會爭辯說,通過setter依賴注入賦予其他對象的對象的所有權將取決於上下文。如果注入的物體是其他人不會使用的物體,則將其轉移到目標上。另一方面,如果其他人打算使用它,那麼你可能會有一個std::shared_ptr的引用。這裏的關鍵是使用現代的「智能」指針將發出信號並強制執行注入對象的所有權。

+0

我還沒有涉及智能指針的話題。我想,這是我閱讀和擁抱的東西。謝謝你到目前爲止。只要我完全理解你的答案(在那之前沒有更好的答案),我會將其標記爲已接受。在此之前(希望非常接近未來),* Thank You *和* + 1 *就足夠了。 – derM