文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

VSCode中依赖注入的原理是什么

2023-07-05 02:33

关注

这篇文章主要介绍“VSCode中依赖注入的原理是什么”,在日常操作中,相信很多人在VSCode中依赖注入的原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VSCode中依赖注入的原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

依赖注入做了什么

假设以下情况:

按照普通的写法就是:

class B {}class A {    constructor() {        // 在 A 的构造器中 new B        this.b = new B();    }}class Feature {    constructor() {        this.a = new A();        this.b = new B();    }}// 使用时const feature = new Feature();

代码简单明了,存在一些问题,比如:如果 A 和 Feature 依赖的 B 需要是同一个实例,以上的写法将会初始化两个 B 实例。【推荐学习:vscode教程、编程教学】

简单修改一下:

class A {    constructor(b: B) {        this.b = b;    }}class Feature {    constructor(a, b) {        this.a = a;        this.b = b;    }}// 使用时const b = new B();const a = new A(b);const feature = new Feature(a, b);

某个模块初始化时,先在外部将其所依赖的模块创建出来,通过参数的形式传入功能模块。这样的写法就是「依赖注入」。

现在这种写法的问题在于:手动传参的形式,必须人工保证 new 的顺序,即必须获得 a, b 实例才能执行 newFeature。

当依赖关系变得复杂时,创建一个功能模块之前很有可能需要无数个基础模块,这时候复杂度将会非常高。

想象一种模式:存在一个模块控制器,或者说「服务管理器」来管理这些依赖关系:

class Feature {    // 声明这个模块依赖 idA, idB    idA    idB}// 告知「服务管理器」,怎么找对应的模块services[idA] = A;services[idB] = B;// 使用时const feature = services.createInstance(Feature);

这个 services 承载的不就是之前的「手工」过程吗?
在 createInstance(Feature) 时,分析 Feature 所依赖的模块:

依赖注入怎么做?

要实现这样一套功能,大致需要:

下文会实现一个最简单的模型,涵盖主体流程。

添加依赖信息

如何给一个 类 打上烙印,声明它所依赖的服务呢?
将问题再次抽象:如何给一个类加上额外的信息?
其实,每个类在 es5 下都是 Function,而每个 Function 说到底也只是 Object ,只要给 Object 加上几个字段来标识所需要的服务 id,就可以完成所需要的功能。
通过 「参数装饰器」的写法,可以很容易做到这一点:

// 参数装饰器 const decorator = (    target: Object, // 被装饰的目标,这里为 Feature    propertyName: string,     index: number // 参数的位置索引) => {    target['deps'] = [{        index,        id: 'idA',    }];}class Feature {    name = 'feature';    a: any;    constructor(        // 参数装饰器        @decorator a: any,    ) {        this.a = a;    }}console.log('Feature.deps', Feature['deps']);// [{ id: 'idA', index: 0 }]

通过这种方式,通过 Feature (之后会称之为 构造器 ctor)就可以获取到 serviceId。

服务管理

使用 Map 来进行管理,一个 id 对应一个 服务 ctor。

class A {    name = 'a';}// 服务集class ServiceCollection {    // 服务集合    // key 为服务标识    // value 为 服务ctor    private entries = new Map<string, any>();    set(id: string, ctor: any) {        this.entries.set(id, ctor);       }    get(id: string): any {        return this.entries.get(id);    }}const services = new ServiceCollection();// 声明服务 A id 为 idAservices.set('idA', A);

现在,就可以通过 Feature 来找到所依赖的服务的构造器了

// 通过 Feature 找到所依赖的 Aconst serviceId = Feature['deps'][0].id; // idAconsole.log(    'Feature.deps',     services.get(serviceId) // A);

模块创建

具体思路为:

这里先上一个简单的 demo,只有一层的依赖(即所依赖的服务没有依赖其他服务),简单的讲,就是没有递归能力:

class InstantiationService {    services: ServiceCollection;    constructor(services: ServiceCollection) {        this.services = services;    }    createInstance(ctor: any) {        // 1. 获取 ctor 依赖的 服务id        // 结果为: ['idA']        const depIds = ctor['deps'].map((item: any) => item.id);        // 2. 获取服务 id 对应的 服务构造器        // 结果为:[A]        const depCtors = depIds.map((id: string) => services.get(id));        // 3. 获取服务实例        // 结果为: [ A { name: 'a'} ]        const args = depCtors.map((ctor: any) => new ctor());        // 4. 依赖的服务作为参数注入,实例化所需要模块        // 结果为:[ Feature { name: 'feature', a }]        const result = new ctor(...args);        return result;    }}const instantiation = new InstantiationService(services);// 使用时const feature = instantiation.createInstance(Feature);

要使用 Feature 时,只需要调用 createInstance,不用管他所依赖的服务是否被初始化,instantiation 帮我们做了这个事情。

到此,关于“VSCode中依赖注入的原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯