控制或依赖注入的反转 - 任何人在C中执行此操作?

时间:2009-12-01 09:45:23

标签: c dependency-injection components

例如,见

https://stackoverflow.com/questions/139299/difference-between-dependency-injection-di-inversion-of-control-ioc

提醒自己IoC和DI是什么。

这里的问答

Is Inversion of Control specific to OO languages?

表明它不需要OO语言。

现在,我的问题是:有人在C中这样做吗?

我在问,因为我们编写嵌入式C并且正在考虑应用这些方法,而不改变我们的编程语言。

2 个答案:

答案 0 :(得分:2)

始终在C中执行此操作。提示在第二个链接中给出了Azder的答案:

“当您为Windows API函数提供指向回调函数的指针时,您可以控制使用自己的参数调用函数。”

从这个角度来看,这个概念已经在标准库中用于函数qsort()和bsearch()。

答案 1 :(得分:0)

在Windows上,你有COM做类似的事情。您有一个接口并在DLL中提供实现。您注册DLL并且注册过程在注册表中创建一个条目映射接口(UUID)和提供实现的DLL。基于此信息,当您执行QueryInterface()时,COM服务将加载相应的DLL并创建实现对象的实例,将其类型化为请求的接口类型并返回。

这是使用COM的IoC。由于COM是在'C'中实现的,我确信它只是在制定细节以使其在您的嵌入式系统上运行。您需要一个文件来存储接口,实现和DLL之间的映射,而不是注册表。这是在Catia(来自Dassault Systemes)的CNext(V5 / V6)架构中完成的。它被称为Object建模器框架。

实现这一目标的步骤:

  1. 为返回指向接口的指针的函数定义命名约定
  2. 创建一个带有接口和DLL的文件,在其中实现
  3. 在DLL中实现接口并更新#2
  4. 中的文件
  5. 在主代码中,读取文件并创建接口和DLL的映射
  6. 当您需要一个接口时,如果没有加载则加载DLL并获取返回指向接口的指针的函数的地址(基于定义的命名约定) 例如:对于IDoSomething接口,您的函数可能是Get_IDoSomething()。 由于我们根据名称获取函数的地址,因此它在运行时完成,而不是在编译时完成。
  7. 从#5获得的地址调用该功能。您现在有一个指向接口的指针,该指针基于#3
  8. 中指定的DLL中的实现

    因此,您可以在运行时将接口绑定到其实现。