【问题标题】:Inversion of Control or Dependency Injection -- anyone doing it in C?控制反转或依赖注入——有人用 C 做吗?
【发布时间】:2009-12-01 09:45:22
【问题描述】:

例如,请看这里

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,并且正在考虑应用这些方法,而无需更改我们的编程语言。

【问题讨论】:

    标签: c dependency-injection components


    【解决方案1】:

    一直在 C 中做。 Azder 在您的第二个链接中的回答中给出了提示:

    “当你给一个 Windows API 函数一个指向回调函数的指针时,你给了他们使用他们自己的参数调用你的函数的控制权。”

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

    【讨论】:

      【解决方案2】:

      在 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的映射
      5. 当您需要接口时,如果未加载 DLL,则加载 DLL 并获取返回接口指针的函数的地址(基于定义的命名约定) 例如:对于 IDoSomething 接口,您的函数可能是 Get_IDoSomething()。 由于我们是根据名称获取函数的地址,所以它是在运行时完成的,而不是在编译时完成的。
      6. 在您从#5 获得的地址处调用函数。您现在有一个指向基于 DLL 中实现的接口的指针,如 #3 中指定的

      因此,您可以在运行时将接口与其实现联系起来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-22
        • 2012-02-05
        • 2011-03-14
        • 2015-07-30
        • 1970-01-01
        • 2010-10-31
        • 2011-02-08
        相关资源
        最近更新 更多