[英]Several questions regarding Dependency Injection in C++
我正在練習依賴項注入,但是我不確定有幾個問題如何處理。
A類可能取決於3-4個其他行為(接口)。 一方面,將它們全部傳遞給構造函數會使對象更難以創建和初始化。 另一方面,如果客戶端忘記設置一個依賴項,則使用setter可能會出現問題。 解決這個問題的正確方法是什么?
最終,所有依賴項都必須在某個地方創建。 如何防止在一個類(例如主類)中進行多次初始化的情況?
在進行依賴注入時,使用shared_ptr是否被視為一種好習慣? 在這種情況下,依賴關系的創建者通常無法刪除對象,因此使用共享指針對我來說很有意義。
A類可能取決於3-4個其他行為(接口)。 一方面,將它們全部傳遞給構造函數會使對象更難以創建和初始化。 另一方面,如果客戶端忘記設置一個依賴項,則使用setter可能會出現問題。 解決這個問題的正確方法是什么?
沒有完美的解決方案,因此您只需要調整即可品嘗。 選項包括:
讓/ a構造函數接受對注入的對象進行分組的結構(如果您將相同的依賴集傳遞給許多構造函數)
在運行時和編譯時之間划分依賴關系,並使用派生/ using
/ typedef
using
考慮編譯時的依賴關系(Alexandrescu的“ Policies” ala Modern C ++ Design)
提供某些/所有依賴項的默認值,或提供一些動態查找“服務”的功能,該服務仍可讓您修改注入但在多個依賴對象構造中仍然存在
有點想象力和對重復代碼的分析會希望對您有所幫助。
最終,所有依賴項都必須在某個地方創建。 如何防止在一個類(例如主類)中進行多次初始化的情況?
這是將冗余依賴關系創建和對象訪問(包括您的選擇是相似的)之間的關系分解在一起的問題,您可以使用結構或容器或管理對象對引用或指針進行傳遞,以對它們進行分組並重新訪問它們。
在進行依賴注入時,使用shared_ptr是否被視為一種好習慣? 在這種情況下,依賴關系的創建者通常無法刪除對象,因此使用共享指針對我來說很有意義。
對於函數,客戶端代碼通常必須比被調用的函數使用時間長,因此不需要共享的指針……引用是理想的。 如果您正在使用線程,或者創建的對象可能超出客戶端代碼的壽命,那么共享指針會很有用。
所有個人意見,但我們走了。
1)將依賴項傳遞給構造函數。 如果存在合理的默認值,則提供多個構造函數或使用默認參數。
2)如果您將頻繁使用同一組依賴項,則可以通過創建“依賴項集”類來節省一些鍵入內容,該類的實例可以傳遞給構造函數,例如:
struct Iface1;
struct Iface2; // Dependent interfaces
struct Iface3;
struct DependencySet
{
Iface1& iface1;
Iface2& iface2;
Iface3& iface3;
};
class Dependent
{
public:
Dependent(DependencySet& set)
: iface1(set.iface1)
, iface2(set.iface2)
, iface3(set.iface3)
{}
private:
Iface1& iface1;
Iface2& iface2;
Iface3& iface3;
};
3)就我個人而言,我更喜歡使用上面的引用並管理生存期,以使依賴項的壽命超過依賴類,但是如果您希望在使用依賴項后就“忘記”它們,可以使用共享指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.