最新要闻
- 高质量发展调研行丨山东烟台:“老树新枝”打造发展新动能
- 泽璟制药:注射用ZG006获得药物临床试验批准通知书
- 韩国室温超导论文真假成谜 专家:极有可能只是假象
- vivo首颗自研6nm芯片!V3影像芯片正式公布
- 这东西也敢偷?卖不掉,就扔进垃圾场……栽了!
- 《封神》票房跻身第四!国内7月总票房突破80亿元
- 华为暴涨58%!2023Q2中国手机市场销量数据出炉
- 被中消协点名后 妙鸭相机上架苹果应用商店:山寨App横行真假难分
- 骁龙870太坚挺!联想小新Pad Pro 12.7上架:2.9K高刷屏
- 曼联新赛季阵容基本完成升级,你认为这个阵容应该拿到什么成绩?
- 豆瓣7.7分 《封神第一部》票房破10亿:张颂文大赞世界级视听效果
- 一口下去嘎嘣脆!亲亲经典虾条大促:5件立减15元 17.9到手
- “原来微信可以防拉黑”引热议 网友:就喜欢看不惯 又拉黑不了的样子
- 事关食品安全,江西明年元旦实施
- 杜苏芮减弱 卡努正在增强:台风吹来的遍地生蚝 到底能不能吃?
- 不愧是新能源行业的“基建狂魔” 蔚来1600座换电站达成
广告
手机

英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌

宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌
- 宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 离婚时共同债务应该怎么处理?
- 华为云盘古大模型3.0正式发布
- 支持自动长文生成,WPS AI发布:基于大语言模型的智能办公助手
- 《街头霸王6》全球总销量突破200万份 卡普空再次为其玩家送上礼物
家电
从0开发属于自己的nestjs框架的mini 版 —— Module篇
(相关资料图)
在开写之前,我们看一下nestjs 关于Module 装饰器的用法:
- 有四个参数,每个参数都是一个数组,controllers控制器,主要是路由的providers 提供给该模块用的服务imports导入的其他模块的服务或者模块exports 导出该模块中的服务
import { Module } from "@nestjs/common";@Module({ controllers: [], providers: [], imports:[], exports:[],})export class AppModule {}
不出意外的无意外,我们将实现该模块的功能,在这里我们只需要三个参数即何,分别是 controllers,providers,imports, 其关键一步就是我们将结合第一篇的ioc来实现
话不多说,上代码
src\ioc-module.ts
引入ioc 核心(ioc篇实现的)
import { Container, ClassProvider, InjectableKey, Provider, Type,} from "./ioc-core";
定义常量
// 标识模块export const IS_Module_KEY = "IS_Module_KEY";// 标识模块注入的参数export const Module_Metate_Params = "Module_Metate_Params";
声明参数类型
/** * 声明模块的参数类型 */export interface Imodule { imports?: Array>; providers?: (Provider | Type)[]; //Array|Type> controllers?: Type[];}
模块的装饰器实现
/** * 定义模块的装饰器 * @param option * @returns */export function Module(option?: Imodule) { return function (target: any) { Reflect.defineMetadata(IS_Module_KEY, true, target); Reflect.defineMetadata(Module_Metate_Params, option, target); return target; };}
模块IOC 的容器
/** * 模块ioc的容器 */export class ContainerModule { private iocInstance: Container; constructor(entryModule?: Type) { this.iocInstance = new Container(); entryModule && this.init(entryModule); } init(entryModule: Type) { this.bindModule(entryModule); this.iocInstance.loading(); } /** * * @returns 获取标识为控制器的实例 */ public getControllerInstance() { let result: Type[] = []; let allInstance = this.iocInstance.getInstance(); allInstance.forEach((value: Type, key) => { if ( typeof key === "function" && Reflect.getMetadata("IS_Controller_KEY", key) ) { result.push(value); } }); return result; } //模块绑定 public bindModule(module: Type) { if (!Reflect.getMetadata(IS_Module_KEY, module)) { console.log("导入的imports参数不属于模块"); return; } const provider = { provide: module, useClass: module }; Reflect.defineMetadata(InjectableKey, true, module); this.iocInstance.add(provider); this.bindLoadModule(provider); } private bindLoadModule(provider: ClassProvider) { let meataData = Reflect.getMetadata( Module_Metate_Params, provider.useClass ); if (!meataData) return; /** * 加载普通的provider */ if (Array.isArray(meataData.providers)) { meataData.providers.forEach((item: ClassProvider) => this.iocInstance.add(item) ); } /** * 加载标识为控制器的provider */ this.bindModuleLoadControllers(meataData.controllers || []); /** * 加载标识为模块的provider */ if (Array.isArray(meataData.imports)) { meataData.imports.forEach((itme: Type) => this.bindModule(itme)); } } /** * 控制器注解,特殊的标记的provider * @param providers */ private bindModuleLoadControllers(providers: Type[]) { if (!Array.isArray(providers)) { return; } providers.forEach((itme) => { Reflect.defineMetadata("IS_Controller_KEY", true, itme); //标志位控制器 Reflect.defineMetadata(InjectableKey, true, itme); //标志为可注入依赖 this.iocInstance.add({ provide: itme, useClass: itme }); }); }}
测试用例
import { Inject, Injectable } from "./ioc-core";import { ContainerModule, Module } from "./ioc-module";import { Type } from "./util";@Injectable()class A { constructor(@Inject("api") private api: string /** b:number **/) { console.log("----实例化A:"); console.log("a-api", this.api); } getA() { console.log("执行到A 类的 getA 方法"); return this.api; }}@Injectable()class B { constructor(@Inject("AA") private a: A, @Inject("api") private api: string) { console.log("----实例化B:"); console.log("B:insA", this.a); console.log("B:api", this.api); } getB() { return this.a.getA(); }}@Injectable()class C { constructor(private b: B, @Inject("api") private api: string) { console.log("----实例化C:"); console.log("C:insB", this.b); console.log("C:api", this.api); } getC() { return this.b.getB(); }}@Module({ providers: [ A, B, { provide: "AA", useClass: A }, { provide: "api", useValue: 123 }, ], controllers: [C], imports:[]})class M {}const m = new ContainerModule(M);let controllers: Array> = m.getControllerInstance();// console.log("控制器实例:", controllers);controllers.forEach((value, key) => { console.log("控制器实例:", value, "---", key);});let c: Type = controllers[0];console.log("控制器实例c:", c, c.getC());
总结
1、ContainerModule 其实还是一个ioc ,只是通过它来进行加在不同类型的服务和递归加载模块容器2、Module 上的 controllers 参数并没有和路由实现相关的东西,本质就是一个provide 提供服务类3、下一篇,我们将两者结合起来实现最终的nestjs的终极版
关键词:
-
-
-
-
从0开发属于自己的nestjs框架的mini 版 —— Module篇
高质量发展调研行丨山东烟台:“老树新枝”打造发展新动能
Golang漏洞管理
泽璟制药:注射用ZG006获得药物临床试验批准通知书
韩国室温超导论文真假成谜 专家:极有可能只是假象
vivo首颗自研6nm芯片!V3影像芯片正式公布
这东西也敢偷?卖不掉,就扔进垃圾场……栽了!
深圳市住房和建设局:更好满足居民刚性和改善性住房需求 促进房地产市场平稳健康发展
《封神》票房跻身第四!国内7月总票房突破80亿元
华为暴涨58%!2023Q2中国手机市场销量数据出炉
被中消协点名后 妙鸭相机上架苹果应用商店:山寨App横行真假难分
骁龙870太坚挺!联想小新Pad Pro 12.7上架:2.9K高刷屏
曼联新赛季阵容基本完成升级,你认为这个阵容应该拿到什么成绩?
豆瓣7.7分 《封神第一部》票房破10亿:张颂文大赞世界级视听效果
一口下去嘎嘣脆!亲亲经典虾条大促:5件立减15元 17.9到手
“原来微信可以防拉黑”引热议 网友:就喜欢看不惯 又拉黑不了的样子
mysql 简单进阶 ———— 多列索引[一]
事关食品安全,江西明年元旦实施
杜苏芮减弱 卡努正在增强:台风吹来的遍地生蚝 到底能不能吃?
不愧是新能源行业的“基建狂魔” 蔚来1600座换电站达成
20万圆“宝马3系”梦!宝马i3被曝19.6万元特价卖
李玟遗产纷争升级,Bruce发声明低调回应,李思林不予回复
罗布泊无人区究竟有多危险?中国四大无人区之一、充满神秘的“地球之耳”
电竞首次入亚!杭州亚运会电竞项目赛程出炉:玩游戏也能拿金牌了
代码随想录算法训练营第三天|力扣203.移除链表元素、力扣707.设计链表、力扣206.反转链表
【设计原则】图解何为依赖倒置
今年暑期档总票房突破120亿
儿子考上北大 奶茶店主送2000杯奶茶 学生:沾沾喜气
少女连续数日高烧不退确诊“接吻病” 医生科普:病毒感染引起
JFrame一些基础小知识
占用应急车道 深圳一宝马男连着两天被后车拍照举报:12分罚款6000
2176万人观看 《封神第一部》票房逼近10亿 知名编剧:第二部比第一部好看至少十倍
大众被曝将使用小鹏旧平台 明年开始向小鹏支付“技术费”
姚振华,又输了!
J.D.Power发布汽车保值率排行榜:日系车屠榜 飞度保值堪比保时捷
自主知识产权!“新舟”60灭火机平台首飞成功:运输、灭火全能王
北京瑞蚨祥(关于北京瑞蚨祥的介绍)
国人自己的操作系统!华为鸿蒙OS 4.0下周发布:官方海报大有玄机
史上最贵!iPhone 15系列全系售价曝光 网友:多花钱也得买高配版
华为nova 10 Pro官方翻新机视频开箱:成色接近新机 只要2499元起
全国文化和旅游资源开发工作会议在并召开
docker查看日志:docker service logs 与 docker container logs
硬件管理平台 - 引言(一)
男子开车时跟老婆吵架车瞬间报废 承担事故全部责任:网友感叹
票房近10亿!《封神》进2023年票房榜前十:投资30亿 导演称若失败10年还债
12999元 感谢老黄?英伟达喊你买卡了:公版RTX 4090卷土重来
北大青鸟手提式环保家用小型车载灭火器到手9元:安全可靠
属于数据的属性的是及时性、链接性_以下哪种情况属于属性错放
瘫痪男子大脑植入芯片:触觉恢复
警惕“杜苏芮”台风:这些用电常识不可忽视
TCL中环公示单晶硅片价格 上调3.5%-5.2%不等
Go语言中init函数执行的顺序
专家:肥胖人群的肥胖程度越来越高
韩国室温超导是突破还是乌龙?专家解读
win11下docker安装常用中间件-Redis
太平天国进入南京以后,确实犯了很多错误,但是也没必要妖魔化太平天国吧?
电影《热烈》首映日当晚票房破2亿!导演大鹏说把片酬给邓超了
太炫了!索泰ChinaJoy 2023展出多款限量显卡
跨越万里的双向奔赴!父母不懂英语 从县城出国看女儿
车辙是什么意思(车辙解释)
[算法笔记] DFS搜索
从此告别涂硅脂 利民推出新款CPU固态导热硅脂片:一片26.9元
POL连续四年第一!华为已发布新一代Wi-Fi 7万兆园区光网
牧原股份董秘回复:公司目前10万头全线场的人员标准配置为100人左右
民间《中国历代文豪图鉴》出炉:文笔李白唯一100分 白居易6边型战士
台风天在玻璃上贴胶带有用吗?300万粉大V科普:徒劳无益 画蛇添足
2023第二季度快递满意度出炉:第一不出意料
马斯克能忍?国内惊显特斯拉Semi电动卡车仿制品 网友:贴脸输出
虐心(关于虐心简述)
蜜雪冰城阴阳怪气瑞幸?实为网友玩梗:讽刺瑞幸多冰
一儿童高速驾车 副驾驶家长直言:龙王儿子必须得会浮水
10999元!拯救者R9000X 2023发布:AMD中国特供锐龙7 7840H
鼠标垫怎么清洗才能干净 鼠标垫怎么清洗
接口自动化测试框架实战训练营第一天
中华老字号:西安饭庄油泼biangbiang面4.9元/盒史低(不到半价)
车船税没白交 一电动出租车涉水漂过:燃油车主集体看呆
索尼音乐喜迎新人:甄子丹女儿官宣出道 仅19岁
回顾:当吴谢宇举起屠刀时,可否想到母亲养育自己的辛苦?人性之复杂难测,善与恶的较量,永无止境
1000元白菜价电视能买吗?这些信息必须掌握
16家网约车平台被约谈:落实降低过高抽成比例要求
凤凰传奇,幸亏没结婚
【技术实战】Vue技术实战【五】
机器人技术打破国外垄断 巨轮智能总经理意外去世:年仅45岁
这种无理数中的无理数 让数学家直呼根本停不下来
8月8日上市 荣耀MagicBook X Pro锐龙版2023亮相:首发MagicOS 7.2
印尼耍蛇人表演时试图亲吻蛇被咬死 眼镜王蛇有多毒:一滴致命
每周4班 哈尔滨至俄罗斯符拉迪沃斯托克航线复航
2230小尺寸 七彩虹新款PCIe 4.0 SSD上架:1TB售499元
2023暑期档票房破120亿:冠军35亿、《封神第一部》冲到第四
各路厂商争抢年轻用户!ChinaJoy 2023开展:ShowGirl小姐姐依然亮眼
VSCode中的快捷键
《中国碳捕集利用与封存年度报告(2023)》发布
不是抖音的错 东方甄选回应直播间被关:自己不小心出问题 积极整改
OPPO Reno10 Pro英雄联盟定制礼盒发布:3899元 标配16GB内存
为什么再度降息十分必要?
app直播源码平台开发防护技术鉴权功能的部署
至少能用30年 美国研发出永久性电池:不爆炸不起火
iPhone 15或全系搭载4800万像素镜头 标准版再度提升
羽毛球——日本公开赛:何冰娇晋级半决赛
2023年度第九批重点作品版权保护预警名单公布