Javascript 显示模块中的依赖项注入

Javascript 显示模块中的依赖项注入,javascript,unit-testing,dependency-injection,Javascript,Unit Testing,Dependency Injection,我通常通过以下方式创建javascript控制器: var module = (function(){ function init(someService){ someService.doSomething(); } return { init: init }; })(); 我刚刚偶然发现了javascript中的依赖项injetion,例如 我想知道的是,从测试的角度来看,在我的链接中使用注入器来注入mock之类的东西,与

我通常通过以下方式创建javascript控制器:

var module = (function(){

    function init(someService){
        someService.doSomething();
    }

    return {
        init: init
    };

})();
我刚刚偶然发现了javascript中的依赖项injetion,例如

我想知道的是,从测试的角度来看,在我的链接中使用注入器来注入mock之类的东西,与像我上面那样简单地传递它们来执行init函数相比,有什么优势吗


更详细地说,今天初始化测试时,我可以通过SomeService模拟。那么我使用注入器或类似的东西有什么意义吗?

您已经在做依赖项注入了。您不是在模块中初始化某个服务,而是将其传递给init方法。这正是依赖注入的意义所在

这些优点之一是易于测试,因为您可以像前面所说的那样注入某个服务的模拟

注入器/依赖项注入容器的使用是为了管理所有这些依赖项。想象一下有更多的模块,所有模块都有它们的依赖项。管理所有这些类的初始化很快就会成为一场噩梦

这是容器的步骤,使DI再次成为一种乐趣

因此,为了回答您的问题,如果这是您所有的代码,那么没有必要使用注入器/容器


更多的例子可以在

上看到,我同意Wouter J,你已经在做依赖注入了。我认为你所说的测试问题更多的是关于如何/哪些文件被加载。如果您有一个模块加载器,如requirejs、browserify或webpack…,您可以在测试模式下填充一些模块,以便替换它们。如果您没有模块加载器,您可以简单地切换在测试模式中添加的脚本标记。感谢您的澄清!这显然只是一个虚构的例子。在我的例子中,你能告诉我如何使用注入器吗?@filur添加了一个例子完全同意,依赖注入只是一种保持依赖性可见、代码库和心智健全的技术。手动注入依赖项是非常好的,就像您现在所做的那样。这被称为穷人的DI,但仍然是一种有效的模式。如果管理这些依赖关系会变得痛苦,例如当服务提供者依次接受依赖关系等时,您可能会考虑使用IOC容器来为您重启。NET中依赖项注入的作者在这个主题上发表了一篇非常好的文章:
module.init(SomeService);
// the Module object
var Module = function (someService) {
    this.someService = someService;
};
Module.prototype.do = function () {
    this.someService.doSomething();
};

// configuring the injector
Injector.add('someService', new SomeService());

// retrieving the module instance with the SomeService being injected
var module = Injector.get(Module);

module.do();