first commit
This commit is contained in:
23
.gitignore
vendored
Normal file
23
.gitignore
vendored
Normal file
@@ -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?
|
||||||
3
.npmignore
Normal file
3
.npmignore
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
src/
|
||||||
|
tsconfig.json
|
||||||
|
test.ts
|
||||||
38
README.md
Normal file
38
README.md
Normal file
@@ -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类"
|
||||||
|
```
|
||||||
6
index.js
Normal file
6
index.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
const { Injectable, Inject } = require("./dist/annotation/Ioc");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
Injectable,
|
||||||
|
Inject
|
||||||
|
};
|
||||||
34
package-lock.json
generated
Normal file
34
package-lock.json
generated
Normal file
@@ -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=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
package.json
Normal file
23
package.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
src/.pydio
Normal file
1
src/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
3da6b690-a18b-4ac9-9765-ae048d66fb04
|
||||||
1
src/annotation/.pydio
Normal file
1
src/annotation/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
858a4c99-abd2-4088-a94f-6c26d93f15e6
|
||||||
36
src/annotation/Ioc.ts
Normal file
36
src/annotation/Ioc.ts
Normal file
@@ -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)])()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
src/model/.pydio
Normal file
1
src/model/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
13fa22d6-8bcf-42e8-9e69-2357f64cdd2c
|
||||||
13
src/model/Ioc.model.ts
Normal file
13
src/model/Ioc.model.ts
Normal file
@@ -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();
|
||||||
20
test.ts
Normal file
20
test.ts
Normal file
@@ -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());
|
||||||
40
tsconfig.json
Normal file
40
tsconfig.json
Normal file
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
1
types/.pydio
Normal file
1
types/.pydio
Normal file
@@ -0,0 +1 @@
|
|||||||
|
72be7c1c-833c-4abc-95de-91a6d1b19824
|
||||||
11
types/Ioc.d.ts
vendored
Normal file
11
types/Ioc.d.ts
vendored
Normal file
@@ -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;
|
||||||
Reference in New Issue
Block a user