繁体   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