[英]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.