咨询热线:15147710999 联系人:郑素琼 地址:西藏自治省拉萨市堆龙德庆县西藏拉萨
解读 IoC 框架 InversifyJS
来源:AG亚游官方入口 发布时间:2019-11-17 点击量:262
原文链接
InversityJS 是一个 IoC 框架。IoC(Inversion of Control) 包括依赖注入(Dependency Injection) 和依赖查询(Dependency Lookup)。
相比于类继承的方式,控制反转解耦了父类和子类的联系。
案例解析
import "reflect-metadata"import { inject, injectable, Container } from "inversify"const container = new Container()@injectable()class PopMusic { getName() { return "流行音乐" }}container.bind("request1").to(PopMusic)@injectable()class ClassicalMusic { getName() { return "古典音乐" }}container.bind("request2").to(ClassicalMusic)@injectable()class Music { pm: any cm: any constructor( @inject("request1") popMusic: any, @inject("request2") classicalMusic: any) { this.pm = popMusic this.cm = classicalMusic } getName() { const result = this.pm.getName() + this.cm.getName() return result }}container.bind("Plan").to(Music)const music: any = container.get("Plan")console.log(music.getName()) // 流行音乐古典音乐
上述案例可以抽象为下图:
虚线表示可以注入,但在代码中没有表现出来。
代码流程可概括如下:
1.将所有相关类(这里指 Music、popMusic、classicMusic) 通过 @injectable
声明进 container
容器;
2.通过 container.get()
获取 container.bind().to(target)
中的目标对象(这里指 Music);
3.如果目标对象中的 constructor() 里有 @inject()
, 则将相应的实例(这里指 PopMusic 与 classicalMusic 的实例)当作构造函数的参数"注入";
inject/injectable 相关源码
inject 源码简化如下:
// 这是一个属性装饰器function inject(serviceIdentifier) { return function (target, targetKey) { const metadataValue = { [targetKey]: [Metadata { key: "inject", value: serviceIdentifier })] } Reflect.defineMetadata("inversify:tagged_props", metadataValue, target.constructor); }}
injectable 源码简化如下:
// 这是一个类装饰器function injectable() { return function (target) { const metadataValue = [] Reflect.defineMetadata("inversify:paramtypes", metadataValue, target) return target }}
从简化版源码中可以看到 inject/injectable 最终是对 Reflect.defineMetadata()
的一个使用。可以将 metadata 看成是一种相对高效的数据结构。
reflect-metadata
InversityJS 深度结合了 reflect-metadata, reflect-metadata 在 Reflect 基础上对其 api 进行了扩展。
metadata 本质上是一个 WeakMap
对象。扩展:Map 和 WeakMap 的区别
Reflect.defineMetadata(metadataKey, metadataValue, target[, propertyKey])
简化版实现如下:
const Metadata = new WeakMap()function defineMetadata(metadataKey, metadataValue, target, propertyKey) { metadataMap = new Map() metadataMap.set(metadataKey, metadataValue) targetMetadata = new Map() targetMetadata.set(propertyKey, metadataMap) Metadata.set(target, targetMetadata)}
Reflect.getOwnMetadata(metadataKey, target[, propertyKey])
简化版实现如下:
function getOwnMetadata(metadataKey, target, propertyKey) { var targetMetadata = Metadata.get(target) var metadataMap = targetMetadata.get(propertyKey) return metadataMap.get(metadataKey)}
其数据结构可表示如下:
WeakMap { target: Map { propertyKey: Map { metadataKey: metadataValue } }}
相关链接
Architecture overview, 1, 0, 9);相关产品
-
家长主动建立了班级QQ群,群里的家长本着建立一个“健康向上的班集体为目标,”发表健康舆论,交流正确向上的经验、思想,互通有无等,极大地促进了班级工作,到目前为止,Q群运行良好,而且还吸引了我班以外的家长和内地家长加入,为班级建设起到了促进作用。
-
北京晨报讯(记者 亢雪松)国际篮联昨天公布了里约奥运会后最新排名,中国男篮排名第14位,没有变化,中国女篮排名下降两位,列第十。
-
威海刘公岛景区16日在其官方微博发起“台赠梅花鹿长鬃山羊选美大赛”投票活动,将目前刘公岛上的8只台湾动物“繁星”、“点点”、“晶晶”、“亮亮”、“天天”、“乐羊羊”、“美美”、“阳阳”的靓照等对外公布,民众可以为心中“最美”台湾动物投票。
-
英伟达、AMD和英特尔等芯片厂商,一直在竞相向亚马逊等云服务公司供应运行人工智能和机器学习应用的高性能芯片。目前英伟达是人工智能芯片领域的领头羊。
-
2012年4月,东风日产正式推出2012款逍客。此次上市的新车属小改款车型,在外观与动力方面没有做出任何改动,只是在配置方面进行了改进与升级。近日,笔者从东风日产北京中汽雷日4S店获悉,逍客现车充足,最高优惠1.6万元。具体如下:
-
过了两个星期,小张接到车行电话,被告知先前那个销售员离职了,他的订单由另外的销售员在跟。“直接问我要什么颜色,要帮我订车,搞得我一头雾水,就跟接手的销售员讲清楚了前因后果。”不过,那时候,电话那头的销售员告知他,如果不买车,订金是退不了的。后来,小张一直争取,车行的经理答应向他们的高层反映这个问题。不过直到最近,尽管多次催促,退还订金的事依然没有解决。
-
友情提示:希望热心网友能够将您所发现的新车谍照拍摄下来,并发送到相应的邮箱内:diezhao@autohome.com.cn,期待您的来信,并成为“谍报家”中的一员。
-
汪汐潮、宋伊人、陆钧彦、鲁筱冉、厉娜也各自分享了拍摄中的趣事,并坦言通过拍摄这部剧,找回了许多学生时代的所经历的故事,有快乐,有感动,而其中最为珍贵的是珍惜。
热点资讯
- 王忠林主持召开“四个中心”建设座谈会:推动“四个中心”建设取得新的更大突破2019-07-01
- 正则表达式re.sub替换不完整的问题现象及其根本原因2019-11-17
- 进军欧洲市场:小米在欧洲注册6个设备2019-10-29
- 贾跃亭双面财技2019-11-16
- 证券监督管理委员会:优化再融资制度,深化市场化并购改革2019-11-15
- 高性能无锁队列Disruptor初体验2019-11-06
- 苹果产品列表中惊现“iPhonexx”或是SE升级版2019-07-01
- 媒体:ofo已拖欠云鸟、德邦等多家物流供应商亿元欠款2019-07-01