Netjs原理

一、TS 反射注解相关

Reflect Metadata 是 ES7 的一个提案,它主要用来在声明的时候添加和读取元数据。Typescript 在 1.5+ 的版本已经支持他。你只需要:

npm i reflect-metadata --save
在 tsconfig.json 里配置 emitDecoratorMetadata 选项
自定义 metadataKey
function classDecorator(): ClassDecorator {
    return target => {
        // 在类上定义元数据,key 为 `classMetaData`,value 为 `a`
        Reflect.defineMetadata('classMetaData', 'a', target);
    };
}

function methodDecorator(): MethodDecorator {
    return (target, key, descriptor) => {
        // 在类的原型属性 'someMethod' 上定义元数据,key 为 `methodMetaData`,value 为 `b`
        Reflect.defineMetadata('methodMetaData', 'b', target, key);
    };
}

@classDecorator()
class SomeClass {
    @methodDecorator()
    someMethod() {}
}

Reflect.getMetadata('classMetaData', SomeClass); // 'a'
Reflect.getMetadata('methodMetaData', new SomeClass(), 'someMethod'); // 'b'

二、Nestjs 的内部服务与路由

nestjs 内部底层默认采用的是 express 框架。 所以一些 express 提供出来的方法,也是可以使用的。

nestjs 是如何将路由和控制器绑定起来的,又如何对接到 express 对象上呢? 当我们在初始化 nest-application 的时候,框架内部会进行路由构建。通过我们在控制器方法使用的注解(例如:@Get、@Post 等),获取到路由信息,构建出 Route 对象,并绑定到 express 对象上面。(其原理正是上述的 Reflect Metadata)

三、依赖注入与控制反转 (IOC 与 DI)

控制反转

在这里插入图片描述

从图中可以看到,软件中的对象就像齿轮一样,协同工作,但是相互耦合,一个零件不能正常工作,整个系统就崩溃了。这是一个强耦合的系统。齿轮组中齿轮之间的啮齿关系,与软件系统中对象之间的耦合关系非常相似。对象之间怼耦合关系是无法避免的,也是必要的,这是协同工作的基础。

为了解决对象间耦合度过高的问题,软件专家提出了IOC理论,用来实现对象之间的 “解耦”。

控制反转 是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助 “第三方” 实现具有依赖关系的对象之间的解耦。

在这里插入图片描述
由于引进了中间位置的 “第三方”,也就是 IOC 容器,使得 A、B、C、D这 4 个对象没有了耦合关系,齿轮之间的传动全部依靠 “第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC 容器成了整个系统的关键核心。

依赖注入
依赖注入 就是将实例变量传入到一个对象中去。主要的好处有:

解耦,将依赖之间解耦

因为已经解耦,所以更方便做单元测试

四、nestjs 如何实现的 IOC,参考

typescript

reflect-metadata

IOC 和 DI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值