【问题标题】:How using dependency injection in a shared library (dll, so)?如何在共享库(dll,so)中使用依赖注入?
【发布时间】:2011-09-16 18:57:30
【问题描述】:

假设在 C++ 中,我在共享库中有一个 API,我想在初始化时在其中注入一些依赖关系。我该怎么做?

例如在调用代码中:

#include "CTest1.h"
#include "CTest2.h"
...
#include "CTest15.h"

class CTest{

int att1;
int att2;

}

在共享库中:

#include "CTest.h"

class export CSharedObject{

  void create(CTest* test){ mtest = test; }
  void doSomething(){ int sum = test->att1+test->att2; }


  CTest* mtest;

}

如何在 CSharedObject 中注入 CTest ?只是包含?但是 CSharedObject 将需要 CTest 需要的所有文件

我需要避免所有这些包括

【问题讨论】:

    标签: c++ dll dependency-injection shared-libraries


    【解决方案1】:

    首先,你的类需要一个接口:

    class CTestIface
    {
      virtual ~CTestIface(){}
      virtual void foo() = 0;
    };
    

    然后在库中添加一个实现:

    class CTest1 : public CTestIface
    {
      void foo(){ /*...*/ }
    };
    

    和 c 函数来创建/删除 CTest11 类型的对象:

    extern C{
    void* Create() { return new CTest1; };
    void Delete( void* o ) { delete( (CTest1*) o ); }
    }
    

    如您所见,您只需要一个定义接口的标题,以及创建/删除对象的函数。

    顺便说一句,在测试中,您应该使用模拟类(从接口继承)

    【讨论】:

    • 其实你没看懂我问什么;在您的代码中, CTestIface 将 CSharedObject 替换为库的接口;但是我需要在CSharedObject中注入 CTest,所以后者可以使用前者
    猜你喜欢
    • 2019-09-07
    • 2011-10-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多