电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JavaScript 依賴注入實現

瀏覽:42日期:2023-11-16 09:56:03

隨著AngularJS的流行,依賴注入開始在JavaScript領域獲得不少的關注。 DI最突出的好處在于開發(fā)可復用可測試的代碼單元。 本文以簡易的代碼解釋DI的實現機制,更多對DI優(yōu)缺點的討論可參考: 什么時候應該使用依賴注入 一文。

一個基本的DI用例

每個模塊聲明自己的依賴,并提供自己的服務。例如:

di.service(’foo’, [’bar’], function foo(bar){ function Foo(){ this.bar = bar; } this.prototype.greeting = function(){ console.log(’hello, world’); } return Foo;}); var foo = di.container.get(’foo’);foo.greeting();

注意依賴注入和CommonJS(或AMD)的區(qū)別, foo 只需要聲明其依賴項 bar 而不需要主動獲取。 正是這一點使得 function foo 對依賴所處的位置和構建方法都完全無知, function foo 成為可測試、可復用的代碼單元。

DI框架的設計

注冊服務和使用服務應該在不同時期進行。 作為一種特殊的依賴解決工具,DI框架將軟件單元的生命周期分為注冊階段和運行階段。 上述例子中,在注冊階段提供 foo 和 bar 服務,在運行階段獲取并使用這些服務。 多數DI框架都采取lazy construction的策略,該策略也避免了在注冊階段進行構造的困難。

服務的定制可以在注冊階段后運行階段前進行。 AngularJS 1 引入配置階段來定制這些服務,其Provider可以理解為一個特化的工廠對象。 BottleJS 則使用修飾器和中間件來支持對服務的定制。

使用IoC容器來索引服務實例或存儲服務提供者。 當有人提供服務時就把它加入到容器中, 當有人使用服務時就從容器中查找提供者并生成一個服務實例。 通常服務的實例可以被緩存。

DI框架的實現

先來實現最常見的接口函數 .service() ,該接口用來注冊一個服務的構造器。 被傳入的函數將會被進行 new 操作。

var di = { container: {}};di.service = function(name, Constructor) { defineLazyProperty(name, () => new Constructor());}; function defineLazyProperty(name, getter){ Object.defineProperty(di.container, name, {configurable: true,get: function() { var obj = getter(container); Object.defineProperty(di.container, name, {configurable: false value: obj }); return obj;} });}

Object.defineProperty 在這里用來做服務緩存。 只在第一次構建服務時調用構造器,后續(xù)的訪問就是直接讀取IoC容器的屬性。 它是ES5的標準方法 兼容性非常好 。 有了 defineLazyProperty() 方法,這些常用的注冊接口實現就很直觀了:

di.factory = function(name, factory) { return defineLazyProperty(name, factory);};di.provider = function(name, Provider) { return defineLazyProperty(name, function(){ var provider = new Provider(); return provider.$get(); });};di.value = function(name, val) { return defineLazyProperty(name, () => val);};

服務的定制接口就不再贅述了,值得一提的是統(tǒng)一的服務定制需要統(tǒng)一的服務構造方法, 而不是直接調用 .defineLazyProperty() 生成屬性。 AngularJS 中這些策略都由Provider來實現, 其他的所有服務注冊方法都借由Provider來實現。

來自:http://harttle.com/2016/11/19/javascript-dependency-injection-implementation.html

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | 卷筒电缆-拖链电缆-特种柔性扁平电缆定制厂家「上海缆胜」 | 微学堂-电动能源汽车评测_电动车性能分享网 | 湖南自考_湖南自学考试网 | 世纪豪门官网 世纪豪门集成吊顶加盟电话 世纪豪门售后电话 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 哈尔滨治「失眠/抑郁/焦虑症/精神心理」专科医院排行榜-京科脑康免费咨询 一对一诊疗 | 薄壁轴承-等截面薄壁轴承生产厂家-洛阳薄壁精密轴承有限公司 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 超声波反应釜【百科】-以马内利仪器 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 知网论文检测系统入口_论文查重免费查重_中国知网论文查询_学术不端检测系统 | 天津市能谱科技有限公司-专业的红外光谱仪_红外测油仪_紫外测油仪_红外制样附件_傅里叶红外光谱技术生产服务厂商 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 耐火浇注料价格-高强高铝-刚玉碳化硅耐磨浇注料厂家【直销】 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 广东机电安装工程_中央空调工程_东莞装饰装修-广东粤标建设有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 软启动器-上海能曼电气有限公司| 管理会计网-PCMA初级管理会计,中级管理会计考试网站 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | 纸布|钩编布|钩针布|纸草布-莱州佳源工艺纸布厂 | 包头市鑫枫装饰有限公司| 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 建筑资质代办-建筑资质转让找上海国信启航| 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | 飞行者联盟-飞机模拟机_无人机_低空经济_航空技术交流平台 |