深入理解Javascript里的依赖注入

  次阅读 来源:互联网(转载协议) 2016-01-26 11:03 我要评论(0)

我喜欢引用这句话, 程序是对复杂性的管理 。计算机世界是一个巨大的抽象建筑群。我们简单的包装一些东西然后发布新工具,周而复始。现在思考下,你所使用的语言包括的一些内建的抽象函数或是低级操作符。这在JavaScript里是一样的

迟早你需要用到其他开发人员的抽象成果即你依靠别人的代码。我喜欢依赖自由(无依赖)的模块,但那是难以实现的。甚至你创建的那些漂亮的黑盒子组件也或多或少会依赖一些东西。这正是依赖注入大显身手的之处。现在有效地管理依赖的能力是绝对必要的。本文总结了我对问题探索和一些的解决方案。

一、目标

设想我们有两个模块。第一个是负责Ajax请求服务(service),第二个是路由(router)。

代码如下:

var service = function() {

return { name: 'Service' };

}

var router = function() {

return { name: 'Router' };

}

我们有另一个函数需要用到这两个模块。

代码如下:

var doSomething = function(other) {

var s = service();

var r = router();

};

为使看起来更有趣,这函数接受一个参数。当然,我们完全可以使用上面的代码,但这显然不够灵活。如果我们想使用ServiceXML或 ServiceJSON呢,或者如果我们需要一些测试模块呢。我们不能仅靠编辑函数体来解决问题。首先,我们可以通过函数的参数来解决依赖性。即:

代码如下:

var doSomething = function(service, router, other) {

var s = service();

var r = router();

};

我们通过传递额外的参数来实现我们想要的功能,然而,这会带来新的问题。想象如果我们的doSomething 方法散落在我们的代码中。如果我们需要更改依赖条件,我们不可能更改所有调用函数的文件。

我们需要一个能帮我们搞定这些的工具。这就是依赖注入尝试解决的问题。让我们写下一些我们的依赖注入解决办法应该达到的目标:

我们应该能够注册依赖关系

1.注入应该接受一个函数,并返回一个我们需要的函数

2.我们不能写太多东西我们需要精简漂亮的语法

3.注入应该保持被传递函数的作用域

4.被传递的函数应该能够接受自定义参数,而不仅仅是依赖描述

5.堪称完美的清单,下面 让我们实现它。

三、RequireJS / AMD的方法

你可能对RequireJS早有耳闻,它是解决依赖注入不错的选择。

代码如下:

define(['service', 'router'], function(service, router) {

// ...

});

这种想法是先描述需要的依赖,然后再写你的函数。这里参数的顺序很重要。如上所说,让我们写一个叫做injector的模块,能接受相同的语法。

代码如下:

var doSomething = injector.resolve(['service', 'router'], function(service, router, other) {

expect(service().name).to.be('Service');

expect(router().name).to.be('Router');

expect(other).to.be('Other');

});

doSomething("Other");

再继续之前我应该解释清楚doSomething函数体内容,我使用expect.js (断言方面的库)仅是为了保证我写的代码的行为和我期望的是一样的,体现一点点TDD(测试驱动开发)方法。

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 让AI触手可及  Qualcomm携手创通联达推出全新终端侧AI开发套件

    让AI触手可及 Qualcomm携手创通联达推出全新终端侧AI开发套件

  • 第一批国家重点研发计划公布,旷视科技开启“五年行动”

    第一批国家重点研发计划公布,旷视科技开启“五年行动”

  • 品友互动为Digital Travel APAC2018 唯一受邀中国AI企业

    品友互动为Digital Travel APAC2018 唯一受邀中国AI企业

  • 长虹新款智能语音空调,告诉你空调也能玩Siri

    长虹新款智能语音空调,告诉你空调也能玩Siri

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...