簡體   English   中英

有關C ++中的依賴注入的幾個問題

[英]Several questions regarding Dependency Injection in C++

我正在練習依賴項注入,但是我不確定有幾個問題如何處理。

  1. A類可能取決於3-4個其他行為(接口)。 一方面,將它們全部傳遞給構造函數會使對象更難以創建和初始化。 另一方面,如果客戶端忘記設置一個依賴項,則使用setter可能會出現問題。 解決這個問題的正確方法是什么?

  2. 最終,所有依賴項都必須在某個地方創建。 如何防止在一個類(例如主類)中進行多次初始化的情況?

  3. 在進行依賴注入時,使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM