{"_id":"@bylive/ioc","name":"@bylive/ioc","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@bylive/ioc","version":"1.0.0","description":"一个高效轻量级的 ioc 控制反转和DI 依赖注入的typescript 库","main":"dist/index.js","keywords":["@bylive/ioc","ioc","ioc-typescript","ts-ioc","ioc-ts","typescript-ioc","nestjs","inversify"],"author":"","license":"ISC","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","watch":"npx tsc --watch","build":"npx tsc"},"types":"./dist/index.d.ts","_id":"@bylive/ioc@1.0.0","_integrity":"sha512-AvMPchXn/drxoSzJkZIfDx2b6GCKgZctNuJekLb7zbWVAx3K19V9TbKgldlm4V8HFmdynt4r5BVggafyFcraSg==","_resolved":"C:\\Users\\11198\\AppData\\Local\\Temp\\f2a1edc4ba4c71d38a6dacb7a6f64ae2\\bylive-ioc-1.0.0.tgz","_from":"file:bylive-ioc-1.0.0.tgz","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-AvMPchXn/drxoSzJkZIfDx2b6GCKgZctNuJekLb7zbWVAx3K19V9TbKgldlm4V8HFmdynt4r5BVggafyFcraSg==","shasum":"d4b12d00fb5d8af7ce085d436d79335e2732496f","tarball":"https://registry.npmjs.org/@bylive/ioc/-/ioc-1.0.0.tgz","fileCount":22,"unpackedSize":34537,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIADk8+FU43vOkAtozLdO4NA9HcXwyo4YUtp+i1BoYobGAiBULid5OkFDBeK3HZMj/w392FG/hbvuxsN8fGPrTmJuew=="}]},"_npmUser":{"name":"beyonds","email":"1119879311@qq.com"},"directories":{},"maintainers":[{"name":"beyonds","email":"1119879311@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/ioc_1.0.0_1683818757927_0.5435596313124131"},"_hasShrinkwrap":false}},"time":{"created":"2023-05-11T15:25:57.876Z","1.0.0":"2023-05-11T15:25:58.127Z","modified":"2023-05-11T15:25:58.308Z"},"maintainers":[{"name":"beyonds","email":"1119879311@qq.com"}],"description":"一个高效轻量级的 ioc 控制反转和DI 依赖注入的typescript 库","keywords":["@bylive/ioc","ioc","ioc-typescript","ts-ioc","ioc-ts","typescript-ioc","nestjs","inversify"],"license":"ISC","readme":"# ioc-typescript\r\n一个高效轻量级的 ioc 控制反转和DI 依赖注入的typescript 库\r\n\r\n#### 基本使用 ContainerBase\r\n```typescript\r\n// import {ContainerBase,Injectable} from \"../index\"\r\nimport {ContainerBase,Injectable} from \"ioc-typescript\"\r\n\r\n\r\n@Injectable()\r\nclass A{\r\n    \r\n    getA(){\r\n       \r\n        console.log(\"class A method getA\")\r\n    }\r\n}\r\n\r\n@Injectable()\r\nclass B{\r\n    constructor(private a:A){}\r\n    getB(){\r\n        this.a.getA()\r\n        console.log(\"class B method getB\")\r\n    }\r\n}\r\n\r\nconst containerIns = new ContainerBase()\r\ncontainerIns.addProviders<any>([A,B]).initLoading()\r\n\r\nlet ins = containerIns.getInstances()\r\nins.forEach((val,key)=>{\r\n    console.log(\"get-ins\",key,val) ; // log 输出： get-ins [class A] A {}, get-ins [class B] B { a: A {} }\r\n})\r\nconst insB:B = ins.get(B)\r\ninsB.getB() ; // log 输出:class A method getA,  class B method getB\r\n\r\n\r\n```\r\n\r\n#### 示例二 :Container 与 Module\r\n\r\n``` typescript\r\n\r\n// import {Container,Injectable, Module} from \"../index\"\r\nimport {Container,Injectable, Module} from \"ioc-typescript\"\r\n\r\n\r\n@Injectable()\r\nclass A{\r\n    \r\n    getA(){\r\n       \r\n        console.log(\"class A method getA\")\r\n    }\r\n}\r\n\r\n@Injectable()\r\nclass B{\r\n    constructor(private a:A){}\r\n    getB(){\r\n        this.a.getA()\r\n        console.log(\"class B method getB\")\r\n    }\r\n}\r\n\r\n@Module({\r\n    providers:[A],\r\n    controllers:[], // 这个特殊是providers \r\n    imports:[]\r\n})\r\nclass Ma{}\r\n\r\n\r\n@Module({\r\n    providers:[B],\r\n    imports:[Ma]\r\n})\r\nclass Mb{}\r\n\r\nconst containerIns = new Container(Mb)\r\nlet ins = containerIns.getInstances()\r\nins.forEach((val,key)=>{\r\n    /** log 输出：\r\n     *  get-ins [class Mb] Mb {}\r\n        get-ins [class B] B { a: A {} }\r\n        get-ins [class Ma] Ma {}\r\n        get-ins [class A] A {}\r\n     */\r\n    console.log(\"get-ins\",key,val) ; \r\n})\r\nconst insB:B = ins.get(B)\r\n/** log 输出:\r\n *  class A method getA\r\n *  class B method getB\r\n */\r\ninsB.getB() ; \r\n\r\n```\r\n\r\n#### 示例三： 循环依赖forwardRef\r\n- A类实例化的时候依赖B类 ,B类的实例化的时候依赖A类 ,这样就造成了依赖循环\r\n-  注意： 不能 A 类的a 方法里面调用B 类的 a 方法，然后B 类的 a 方法 又调用了A 类的a 方法 ，这种就是死循环，无解\r\n\r\n------------\r\n>  src/depA.ts\r\n\r\n\r\n```typescript\r\n\r\n// import { Injectable ,Inject,forwardRef} from \"../../index\";\r\nimport { Injectable ,Inject,forwardRef} from \"ioc-typescript\";\r\nimport { B } from \"./depB\";\r\n\r\n\r\n@Injectable()\r\nexport class A {\r\n  constructor(@Inject(forwardRef(()=>B)) private b:B){}\r\n  getA() {\r\n    this.b.getA()\r\n    console.log(\"class A methond getA\");\r\n  }\r\n\r\n  getB() {\r\n    console.log(\"class A methond getB\");\r\n  }\r\n}\r\n\r\n```\r\n>  src/depB.ts\r\n\r\n```typescript\r\n// import { Injectable ,Inject,forwardRef} from \"../../index\";\r\nimport { Injectable ,Inject,forwardRef} from \"ioc-typescript\";\r\nimport { A } from \"./depA\";\r\n\r\n\r\n@Injectable()\r\nexport class B {\r\n  constructor(@Inject(forwardRef(()=>A)) private a:A){}\r\n  getA() {\r\n    console.log(\"class B methond getA\");\r\n  }\r\n  getB() {\r\n    this.a.getB()\r\n    console.log(\"class B methond getB\");\r\n  }\r\n}\r\n\r\n```\r\n\r\n> src/index.ts\r\n\r\n```typescript\r\n\r\n// import {Container,forwardRef, Module} from \"../../index\"\r\nimport {Container,Injectable, Module} from \"ioc-typescript\"\r\nimport {A} from \"./depA\"\r\nimport {B} from \"./depB\"\r\n\r\n\r\n@Module({\r\n    providers:[forwardRef(()=>A),forwardRef(()=>B)],\r\n    imports:[]\r\n})\r\nclass M{}\r\n\r\nconst containerIns = new Container(M)\r\nlet ins = containerIns.getInstances()\r\nins.forEach((val,key)=>{\r\n    /** log 输出：\r\n      get-ins [class M] M {}\r\n      get-ins [class A] <ref *1> A { b: B { a: [Circular *1] } }\r\n      get-ins [class B] <ref *1> B { a: A { b: [Circular *1] } }\r\n     */\r\n    console.log(\"get-ins\",key,val) ; \r\n})\r\n\r\n\r\n/** log 输出:\r\n*  class B methond getA\r\n*  class A methond getA\r\n*/\r\nconst insA:A = ins.get(A)\r\ninsA.getA() ;\r\n\r\n\r\n\r\n/** log 输出:\r\n * class A methond getB\r\n * class B methond getB\r\n */\r\nconst insB:B = ins.get(B)\r\ninsB.getB() ;\r\n\r\n```\r\n\r\n#### 示例4 ，三种绑定用法\r\n - 类绑定：{ provide， useClass}，\r\n - 工厂方法绑定: { provide，useFactory}\r\n - 值绑定： { provide，useValue}\r\n\r\n```typescript\r\n// import {Inject,InjectToken,Injectable,forwardRef,Container,Module} from \"../index\"\r\nimport {Inject,InjectToken,Injectable,forwardRef,Container,Module} from \"ioc-typescript\"\r\n\r\n\r\n const APP_URL = new InjectToken(\"APP_URL\")\r\n\r\n@Injectable()\r\nclass A{\r\n\r\n    getA(){\r\n\r\n        console.log(\"class A method getA\")\r\n    }\r\n}\r\n\r\n@Injectable()\r\nclass B{\r\n    constructor(private a:A){}\r\n    getB(){\r\n        this.a.getA()\r\n        console.log(\"class B method getB\")\r\n    }\r\n}\r\n\r\n@Injectable()\r\nexport class C{\r\n    constructor(\r\n        @Inject(APP_URL) private appUrl:string\r\n    ){\r\n        console.log(this.appUrl,\"C int----------\")\r\n    }\r\n}\r\n\r\n\r\n@Module({\r\n    providers: [\r\n        A,\r\n        {provide:B,useClass:B},\r\n        {provide:C,useClass:forwardRef(()=>C)},\r\n        {\r\n        provide: APP_URL,\r\n            useFactory: () => \"http://www.baidu.com\",\r\n        },\r\n        {provide:\"useValue\",useValue:\"this is useValue\"},\r\n        {provide:\"useFactory\",useFactory:()=>\"this is useFactory\"},\r\n        {provide:\"config\",useValue:()=>({  id:12 })}\r\n    ],\r\n    controllers: [],\r\n  })\r\n  class userApp {\r\n    constructor() {\r\n      console.log(\"userApp init....\");\r\n    }\r\n  }\r\n\r\n\r\n\r\n  const containerIns = new Container(userApp);\r\n  let ins = containerIns.getInstances()\r\n\r\n  ins.forEach((val,key)=>{\r\n     /**\r\n      * log 输出：\r\n      * userApp init....\r\n        http://www.baidu.com C int----------\r\n        get-ins key:---: [class userApp] ----val---: userApp {}\r\n        get-ins key:---: [class A] ----val---: A {}\r\n        get-ins key:---: [class B] ----val---: B { a: A {} }\r\n        get-ins key:---: InjectToken { injectIdefer: 'APP_URL' } ----val---: http://www.baidu.com\r\n        get-ins key:---: useValue ----val---: this is useValue\r\n        get-ins key:---: useFactory ----val---: this is useFactory\r\n        get-ins key:---: config ----val---: [Function: useValue]\r\n        get-ins key:---: [class C] ----val---: C { appUrl: 'http://www.baidu.com' }\r\n      */\r\n      console.log(\"get-ins\",\"key:---:\",key,\"----val---:\",val)\r\n  })\r\n\r\n\r\n\r\n```\r\n\r\n\r\n### APi 参数说明\r\n一、  提供两个容器,ContainerBase 与 Container ，Container 是增强版继承与ContainerBase， 与@Module 结合使用\r\n\r\n------------\r\n\r\n\r\n1、ContainerBase：\r\n构造函数参数：无\r\n实例方法有：\r\n  - getInstances()： 获取所有容器已经注册的服务 \r\n  \r\n  - addProvider(provider:Type<T> | Provider<T> | IforwardRef<T>)： 单个添加已经被注解的类，或者工厂函数，值\r\n  \r\n  - addProviders(providers:Array<Type<T> | Provider<T> | IforwardRef<T>>): 批量添加已经被注解的类，或者工厂函数，值\r\n  \r\n  - bind(provider:Provider<T>): 单个绑定注入,约定三种结构：`{provide:\"\",useClass:}、{provide:\"\",useFactory:} 、 {provide:\"\",useValue:}`\r\n  \r\n  - initLoading()：初始化所有提供者服务Provider\r\n  \r\n  - get(type: Token<T>): 根据 provide 获取注入的服务\r\n\r\n2、Container : \r\n 构造函数参数： 接受一个参数 使用@module 注入的服务\r\n 实例方法: 继承ContainerBase\r\n \r\n二、 提供三个注解方法 @Inject、@Injectable 、@Module\r\n\r\n------------\r\n\r\n| 装饰器方法 | 描述                |\r\n| ------------- | ------------------------------ |\r\n| `@Inject`      | 构造函数参数的注入器       |\r\n| `@Injectable`   |  标志可注入依赖   |\r\n| `@Module`   | 标志可注入依赖的模块，接受一个参数对象 {providers，controllers，imports}     |\r\n\r\n三、forwardRef：标志这是一个依赖循环的服务，接受一个函数，返回 一个provider\r\n\r\n------------\r\n四、InjectToken：是一个构造类，用于生成一个 可以注入的provider服务\r\n\r\n------------","readmeFilename":"README.md"}