“IOC容器”只是维护依赖吗?

问题描述 投票:0回答:1

根据wiki

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


Image processing应用程序是OOP范例样式C语法,它解决了4个角色,如下所示。

1) interface (handlers.h)

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

2) Take one Dependency (gifhandler.c)

imageHandler gifhandler = {
    gif_canHandle,
    gif_drawImage,
    gif_savefile
};

3) Dependency container (dealt by 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) Client - Service locator (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中添加一个新条目,如下所示:

的config.txt

./libgifhandl.so.1

./libtiffhandl.so.1

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

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

所以,如果config.txt变空,那么,应用程序什么都不做,除了说We cannot handle this kind of files,显示here,任何输入(图像文件)。

以下是呼叫流程的可视化,

enter image description here

题:

1)依赖容器是否与IOC容器不同?

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

javascript c spring design-patterns ioc-container
1个回答
1
投票

这些基本上是一回事。人们倾向于互换使用它们。你可以找到一个很好的解释herehere。 您已经展示的实现允许简单的运行时注入依赖项,但所谓的IoC容器(如Spring上下文)也没有什么不同。

© www.soinside.com 2019 - 2024. All rights reserved.