【问题标题】:Difference between javascript modularisation and dependency Injectionjavascript模块化和依赖注入之间的区别
【发布时间】:2016-08-14 16:42:28
【问题描述】:

javascript代码的模块化(以browserify为例)和依赖注入有什么区别?

它们是同义词吗?两人要一起去吗?还是我错过了什么?

【问题讨论】:

标签: javascript dependency-injection theory modularization


【解决方案1】:

模块化是指将代码分解成单独的、独立的“包”。
依赖注入是指不对其他模块的引用进行硬编码。

作为一个实际示例,您可以编写不使用依赖注入的模块:

import { Foo } from 'foo';

export function Bar() {
    return Foo.baz();
}

这里有两个模块,但是这个模块导入了一个特定的其他硬编码模块。

使用依赖注入编写的相同模块:

export function Bar(foo) {
    return foo.baz();
}

然后其他人可以将其用作:

import { Foo } from 'foo';
import { Bar } from 'bar';

Bar(Foo());

在调用时注入 Foo 依赖项,而不是对依赖项进行硬编码。

【讨论】:

    【解决方案2】:

    你可以参考这个article

    模块是实现特定功能的代码片段, 是使用特定技术编写的。没有开箱即用 JavaScript 语言中的模块化方案。即将到来的 ECMAScript 6 规范倾向于通过引入 JavaScript 语言本身的模块概念。这就是未来。

    Dependency injection in JavaScript

    目标

    假设我们有两个模块。第一个是服务 发出 Ajax 请求,第二个是路由器。

    var service = function() {
        return { name: 'Service' };
    }
    var router = function() {
        return { name: 'Router' };
    }
    

    我们还有另一个需要这些模块的功能。

    var doSomething = function(other) {
        var s = service();
        var r = router();
    };
    

    为了让事情变得更有趣,这个函数 需要再接受一个参数。当然,我们可以使用上面的代码, 但这并不是很灵活。如果我们想使用 ServiceXML 或 服务JSON。或者如果我们想模拟一些模块怎么办? 测试目的。我们不能只编辑函数的主体。这 我们都想出的第一件事是将依赖项传递为 函数的参数。即:

    var doSomething = function(service, router, other) {
        var s = service();
        var r = router();
    };
    

    通过这样做,我们传递了模块的确切实现 我们想要的。然而这带来了一个新的问题。想象一下,如果我们有 doSomething 遍布我们的代码。如果我们需要第三个会发生什么 依赖。我们无法编辑所有函数的调用。所以,我们需要一个 仪器将为我们做到这一点。这就是依赖注入器 正在努力解决。让我们写下我们想要实现的几个目标 实现:

    • 我们应该能够注册依赖项
    • 注入器应该接受一个函数并返回一个函数,该函数以某种方式获取所需资源
    • 我们不应该写很多,我们需要简短而优美的语法
    • 注入器应保持传递函数的范围
    • 传递的函数应该能够接受自定义参数,而不仅仅是描述的依赖项

    一个不错的列表不是吗。让我们开始吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2018-10-20
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多