Inject函数在代码编译阶段便会执行,将导致B.prototype在代码编译阶段被修改,这违反了六大设计原则之开闭原则(避免直接修改类,而应该在类上进行扩展)那么该如何解决这个问题呢,我们可以借鉴一下TypeDI typedi— typedi 是一款支持TypeScript和JavaScript依赖注入工具 typedi 的依赖注入思想是类似的,不过多维护了一个container 1. metadata 在了解其 container前,我们需要先了解 typedi 中定义的metadata,这里重点讲述一下我所了解的比较重要的几个属性。 先对B进行实例化,然后从handlers待处理数组取出对应的value函数并执行修改实例化对象的属性值,这样不会影响Class B 自身 实例的属性值被修改后,将被缓存到metadata.value(typedi 相关资料可查看: https://stackoverflow.com/questions/55684776/typedi-inject-doesnt-work-but-container-get-does
methodName: 'somePostMethod' * }] * */ 最后,只需把 route 相关信息绑在对应的http框架上即可 reflect-metadata更多api可以参考 typedi 最后再简单介绍介绍typedi 引用文档的介绍。 typedi是一个 typescript(javascript)的依赖注入工具,可以在 node.js 和浏览器中构造易于测试和良好架构的应用程序。 主要有以下特性: 基于属性/构造函数的依赖注入 单例/临时服务 可以支持多个container 官网例子,非常方便实现依赖注入使用 import { Container, Service } from 'typedi constructor( // because we annotated ExampleInjectedService with the @Service() // decorator TypeDI
现在让我们来看一个使用 TypeDI 的 NPM 库示例,以下 Node.js 示例将引入 DI。 可以在官网查看更多关于 TypeDI 的信息。 https://www.github.com/typestack/typedi typescript 示例 import { Service } from 'typedi'; @Service() export const user = this.userModel.findById(userId); return user; } } services/user.ts 现在 TypeDI import { Container } from 'typedi'; import UserService from '..
TypeStack[102],包括Class-Validator[103](校验)、Class-Transformer[104](TS类与普通对象之间的转化、操作)、TypeDI[105](一个实现极简的依赖注入库 typestack/class-validator [104] Class-Transformer: https://github.com/typestack/class-transformer [105] TypeDI : https://github.com/typestack/typedi [106] Routing-Controllers: https://github.com/typestack/routing-controllers
这也带来了一种新的启发:对于仅关注特定场景的代码转换,如导入语句之于 Vite,装饰器之于 Inversify、TypeDI 这样的场景,大动干戈的使用 AST 就属于杀鸡焉用牛刀了。
https://github.com/midwayjs/injection https://github.com/jeffijoe/awilix https://github.com/typestack/typedi
TypeStack,包括Class-Validator(校验)、Class-Transformer(TS类与普通对象之间的转化、操作)、TypeDI(一个实现极简的依赖注入库)、Routing-Controllers