簡體   English   中英

C ++中的依賴注入

[英]Dependency Injection in C++

如何在不使用框架或反射的情況下明確地在C ++中實現依賴注入?

我可以使用工廠返回auto_ptr或shared_ptr。 這是一個很好的方法嗎?

只需將shared_ptr用於您需要的服務,並為其創建一個setter。 例如:

class Engine;

class Car {
public:
    void setEngine(shared_ptr<Engine> p_engine) {
        this->m_engine = p_engine;
    }

    int onAcceleratorPedalStep(int p_gas_pedal_pressure) {
        this->m_engine->setFuelValveIntake(p_gas_pedal_pressure);
        int torque = this->m_engine->getTorque();
        int speed = ... //math to get the car speed from the engine torque
        return speed;
    }

protected:
    shared_ptr<Engine> m_engine;
}

// (now must create an engine and use setEngine when constructing a Car on a factory)

避免使用auto_ptr,因為您無法通過多個對象共享它(它在分配時轉移所有權)。

AFAIK依賴注入只意味着存在另一個組件所需的組件接口。

namespace ifc {
  struct service { 
    virtual ~service() {}
    virtual do_stuff(/*..*/) = 0;  
  };
} // ns ifc

class ServiceProviderA : public ifc::service 
{ 
public;
  do_stuff(/*..*/) { /*...*/ }
};

class ServiceProviderB : public ifc::service {/*...*/};

class Client
{
public;
  client(ifc::service*);
private:
  ifc::service* m_service;
}; 

我只能猜測,但你的問題是如何管理注入對象的生命周期?

如何假設注入對象的所有權轉移到依賴對象。 這將解決組合的生命周期問題,避免使用智能指針。 但是,對於所有權重要的復雜情況,智能指針將是您的選擇。

class Car {
    public:
      Car(IEngine *pEngine) {
        m_pEngine = pEngine;
      }

      ...

      ~Car()
      {
         delete m_engine;
      }

    protected:
      IEngine *m_pEngine;
    }

對於dependet肯定比注入對象具有更少生命周期的情況,最好將注入對象作為參考傳遞。 這將清楚地表明注入的對象不歸dependet對象所有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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