2009-12-01 23 views
3

见,例如,这里控制反转或依赖注入 - 任何人在C中执行它?

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

,提醒自己什么IOC和DI的。

的问题和答案在这里

Is Inversion of Control specific to OO languages?

表明,它并不需要一个面向对象的语言。

现在,我的问题:任何人在C这样做?

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

回答

2

在C中一直这样做。在你的第二个链接的答案中给出了提示:来自Azder的回答:

“当你给Windows API函数一个指向回调函数的指针时,你可以让他们控制用自己的参数调用你的函数。“

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

0

在windows上,你有COM做类似的事情。你有一个接口并在DLL中提供一个实现。您注册DLL,注册过程在注册表中映射接口(UUID)和提供实现的DLL。根据这些信息,当您执行QueryInterface()时,COM服务将加载相应的DLL并创建实现对象的实例,将其转换为所请求的接口类型并返回。

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

步骤来实现这一目标:

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

因此,您将接口与运行时的实现绑定在一起。