【问题标题】:Does "IOC container" just maintain dependencies?“IOC 容器”是否只维护依赖关系?
【发布时间】:2017-12-14 03:40:57
【问题描述】:

根据wiki,

依赖项是可以使用(作为服务)的对象。


Image processing 应用程序是面向 4 个角色的 OOP 范式样式 C 语法,如下所示。

1) 接口 (handlers.h)

typedef struct {
    int (*canHandle) (char *);
    int (*drawImage)(char *);
    int (*savefile)(char *);
}imageHandler;

2) 取一个依赖 (gifhandler.c)

imageHandler gifhandler = {
    gif_canHandle,
    gif_drawImage,
    gif_savefile
};

3) 依赖容器(由config.c处理)

//gifhandler.c - dependency 
int _init(){
    printf(" registering gifhandler \n");
    reg_handler(&gifhandler);
    return 0;
}

//config.c
imageHandler *imagehandlers[10];
int reg_handler(imageHandler *ih){
// we need to perform checks here.
    imagehandlers[libs] = ih;
    libs++;
    return TRUE;
}
// config.c
int init_handlers(){
    .....
    soptr = dlopen(so_name,RTLD_NOW);
    ....
}

4) 客户端 - 服务定位器 (UI.C)

// UI.C
switch(choice){
        case 1:
            vdrawImage(filename);   
            break;
        case 2:
            vsavefile(filename);
            break;
}
// viml.c
int vdrawImage(char *filename){
    ...
    handleno = find_handler(filename);
    ...
    ih=imagehandlers[handleno];
    ih->drawImage(filename);    
    return FALSE;       
}
// viml.c
int vsavefile(char *newfilename ){
    ...
    handleno = find_handler(newfilename);
    ...
    ih=imagehandlers[handleno];
    ih->savefile(newfilename); 
}

1)要在Dependency容器中添加新的依赖项(libxyzhandl.so.1),只需要在config.txt中添加一个新条目configurable,如下图,

config.txt

./libgifhandl.so.1

./libtiffhandl.so.1

2) ./libxyzhandl.so.1 提供的新服务,将包含在依赖容器中无需重新编译应用程序。

3) 完整应用程序的测试不需要,libxyzhandl.so 的源代码除外。

因此,如果 config.txt 为空,则应用程序什么也不做,除了对任何输入(图像文件)说 We cannot handle this kind of files,显示为 here。

下面是调用流程的可视化,

问题:

1) 依赖容器与IOC容器有区别吗?

2) Spring IOC 容器 是否提供了比仅仅维护依赖项更多的功能?

【问题讨论】:

    标签: javascript c spring design-patterns ioc-container


    【解决方案1】:

    这些基本上是一样的。人们倾向于互换使用它们。你可以找到一个很好的解释here和here。
    您展示的实现允许对依赖项进行简单的运行时注入,但像 Spring 上下文这样的所谓 IoC 容器 也不例外。

    【讨论】:

    • 1) 但在我的代码中,查找依赖项是使用服务定位器而不是 DI 完成的。 2)我说我的代码作为 IOC 容器,因为在用户提供任何输入以定位和使用服务之前,我们维护了在 config.txt 中配置的所有依赖项
    • 我认为你已经结合了这两种方法 - 你的服务定位器使用 DI 容器来解决依赖关系,然后将它们传递给你的应用程序。
    • 那么,我可以调用这个提供IOC容器并实现服务定位器模式的代码来从容器中定位服务吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多