From b6fac0aad88691aec21d8e0fdccb94441fad5439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BC=96=E7=A0=81=E7=8C=BF?= Date: Fri, 27 Sep 2024 01:24:57 +0800 Subject: [PATCH] first commit --- .gitignore | 23 +++++++++++++++++++++++ .npmignore | 3 +++ .pydio | 1 + README.md | 38 ++++++++++++++++++++++++++++++++++++++ index.js | 6 ++++++ package-lock.json | 34 ++++++++++++++++++++++++++++++++++ package.json | 23 +++++++++++++++++++++++ src/.pydio | 1 + src/annotation/.pydio | 1 + src/annotation/Ioc.ts | 36 ++++++++++++++++++++++++++++++++++++ src/model/.pydio | 1 + src/model/Ioc.model.ts | 13 +++++++++++++ test.ts | 20 ++++++++++++++++++++ tsconfig.json | 40 ++++++++++++++++++++++++++++++++++++++++ types/.pydio | 1 + types/Ioc.d.ts | 11 +++++++++++ 16 files changed, 252 insertions(+) create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .pydio create mode 100644 README.md create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/.pydio create mode 100644 src/annotation/.pydio create mode 100644 src/annotation/Ioc.ts create mode 100644 src/model/.pydio create mode 100644 src/model/Ioc.model.ts create mode 100644 test.ts create mode 100644 tsconfig.json create mode 100644 types/.pydio create mode 100644 types/Ioc.d.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..403adbc --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..6c622c8 --- /dev/null +++ b/.npmignore @@ -0,0 +1,3 @@ +src/ +tsconfig.json +test.ts \ No newline at end of file diff --git a/.pydio b/.pydio new file mode 100644 index 0000000..6501f13 --- /dev/null +++ b/.pydio @@ -0,0 +1 @@ +b387b77e-e586-4b21-911b-b40e25519cbd \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4acdac0 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +> 一款适用于Typescript项目的简易依赖注入插件 + +**只支持类的属性进行注入,本人使用最多的也是这种方式** + +## 安装 + +```bash +npm i --save bmydi +``` + +## 使用 + +- @Injectable():加在需要被注入的类上,主要作用是收集依赖 +- @Inject():放在类的属性上,会把`@Injectable()`的类注入到属性上 + +示例: + +```typescript +import { Inject, Injectable } from "bmydi"; + +@Injectable() +class Demo1 { + public hello: string = "我是Demo1类" +} + +class Demo2 { + + @Inject() + public test!: Demo1; + + public GetTest(): string { + return this.test.hello + } +} + +var a = new Demo2(); +console.log(a.GetTest()); // 返回:"我是Demo1类" +``` \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..0cfc35e --- /dev/null +++ b/index.js @@ -0,0 +1,6 @@ +const { Injectable, Inject } = require("./dist/annotation/Ioc"); + +module.exports = { + Injectable, + Inject +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7358079 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,34 @@ +{ + "name": "bmydi", + "version": "1.2.5", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==", + "dev": true + }, + "bmydi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/bmydi/-/bmydi-1.2.5.tgz", + "integrity": "sha512-yT9vPNYTO4XaUrkxw5GsXHPDVRG6altCG/aEnZhoYMkEelqoFk6TC7ekIJQrJkIXdNPUvZsCKC/m91E55+YVug==", + "requires": { + "bmydi": "^1.0.0", + "reflect-metadata": "^0.1.13", + "tslib": "^1.10.0" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..85e549b --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "bmydi", + "version": "1.2.5", + "description": "一款适用于Typescript项目的简易依赖注入插件", + "main": "index.js", + "typings": "types/Ioc.d.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "依赖注入,di" + ], + "author": "bmy", + "license": "ISC", + "dependencies": { + "bmydi": "^1.0.0", + "reflect-metadata": "^0.1.13", + "tslib": "^1.10.0" + }, + "devDependencies": { + "@types/node": "^13.7.1" + } +} \ No newline at end of file diff --git a/src/.pydio b/src/.pydio new file mode 100644 index 0000000..6d8a50e --- /dev/null +++ b/src/.pydio @@ -0,0 +1 @@ +3da6b690-a18b-4ac9-9765-ae048d66fb04 \ No newline at end of file diff --git a/src/annotation/.pydio b/src/annotation/.pydio new file mode 100644 index 0000000..a04d719 --- /dev/null +++ b/src/annotation/.pydio @@ -0,0 +1 @@ +858a4c99-abd2-4088-a94f-6c26d93f15e6 \ No newline at end of file diff --git a/src/annotation/Ioc.ts b/src/annotation/Ioc.ts new file mode 100644 index 0000000..4ff9bc8 --- /dev/null +++ b/src/annotation/Ioc.ts @@ -0,0 +1,36 @@ +import "reflect-metadata"; +import IocModel from "../model/Ioc.model"; +/** + * 收集类依赖 + * @constructor + */ +export function Injectable() { + return (_constructor: { new (...args: any[]): {}; }) => { + if(IocModel.classPool.indexOf(_constructor) !== -1) { + throw new Error('无需重复收集类'); + } else { + //注册 + IocModel.classPool = [_constructor] + } + } +} + +/** + * 将类依赖实例化然后注入到被装饰的属性中 + * @constructor + */ +export function Inject() { + return function (target: any, propertyName: string) { + /** + * 使用 reflect-metadata 提供的内置 类型元数据键 design:type 通过反射拿到被装饰属性的类型 + * 也就是 类属性要实例化 的 service 类 + */ + const propertyType: any = Reflect.getMetadata('design:type', target, propertyName); + if (IocModel.classPool.indexOf(propertyType) == -1) { + throw new Error('被装饰的属性所属的变量类型类,没有被装饰器@Injectable()注入,请检查!'); + } else { + // 从存取器的数组中通过下标取出被装饰属性对应的service类,然后实例化这个类,在放入被装饰的属性中 + target[propertyName] = new (IocModel.classPool[IocModel.classPool.indexOf(propertyType)])() + } + } +} diff --git a/src/model/.pydio b/src/model/.pydio new file mode 100644 index 0000000..e8acb2b --- /dev/null +++ b/src/model/.pydio @@ -0,0 +1 @@ +13fa22d6-8bcf-42e8-9e69-2357f64cdd2c \ No newline at end of file diff --git a/src/model/Ioc.model.ts b/src/model/Ioc.model.ts new file mode 100644 index 0000000..24ddff3 --- /dev/null +++ b/src/model/Ioc.model.ts @@ -0,0 +1,13 @@ +class IocModel { + private _classPool: Array<{ new (...args: any[]): {}; }> = []; + + get classPool(): Array<{ new(...args: any[]): {} }> { + return this._classPool; + } + + set classPool(value: Array<{ new(...args: any[]): {} }>) { + this._classPool = [...value, ...this._classPool] + } +} + +export default new IocModel(); diff --git a/test.ts b/test.ts new file mode 100644 index 0000000..30dcf0c --- /dev/null +++ b/test.ts @@ -0,0 +1,20 @@ +import { Inject, Injectable } from "bmydi"; + +@Injectable() +class Demo1 { + public hello: string = "我是Demo1类" +} + +class Demo2 { + + @Inject() + public test!: Demo1; + + public GetTest(): string { + return this.test.hello // 返回:"我是Demo1类" + } +} + + +var a = new Demo2(); +console.log(a.GetTest()); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..2357427 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "outDir": "dist/", + "target": "es5", + "module": "commonjs", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "declaration": true, + "declarationDir": "types", + "sourceMap": false, + "baseUrl": ".", + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue", + "tests/**/*.ts", + "tests/**/*.tsx", "test.ts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/types/.pydio b/types/.pydio new file mode 100644 index 0000000..3052e89 --- /dev/null +++ b/types/.pydio @@ -0,0 +1 @@ +72be7c1c-833c-4abc-95de-91a6d1b19824 \ No newline at end of file diff --git a/types/Ioc.d.ts b/types/Ioc.d.ts new file mode 100644 index 0000000..b7f7d4d --- /dev/null +++ b/types/Ioc.d.ts @@ -0,0 +1,11 @@ +import "reflect-metadata"; +/** + * 收集类依赖 + * @constructor + */ +export declare function Injectable(): (_constructor: new (...args: any[]) => {}) => void; +/** + * 将类依赖实例化然后注入到被装饰的属性中 + * @constructor + */ +export declare function Inject(): (target: any, propertyName: string) => void;