我正在寻找一种在C语言中进行DI(依赖注入)的好的技术解决方案。
我已经看到了一些关于DI的问题,但是我还没有看到实际示例或具体的实现建议。
所以,假设我们有以下情况:
我们有一组C语言模块;我们想要重构这些模块,以便我们可以使用DI来运行单元测试等操作。
每个模块实际上都包含一组C函数:
module_function(...);
模块之间存在依赖关系。也就是说,通常会有像这样的调用:
int module1_doit(int x) {
int y = module2_dosomethingelse(x);
y += 2;
return(y);
}
如何正确地进行依赖注入?
可能的解决方案包括:
(1) 对于所有模块函数,使用函数指针,并在调用函数时执行以下操作(或类似操作):
int y = modules->module2->dosomethingelse(x);
(2) 编译多个库(mock、std等),这些库具有相同的符号,并动态链接到正确的实现。
(2) 似乎是正确的做法,但配置起来很困难,而且令人烦恼的是,你必须为每个单元测试构建多个二进制文件。
(1) 看起来可能可行,但在某些情况下,你的DI控制器将陷入一种需要动态调用通用工厂函数(例如void ( factory) (...))以及需要在运行时注入其他模块的情况中?
在c语言中是否有另一种更好的方法?
什么是“正确”的做法?