Nodejs实现依赖注入

sactive-di是我自己实现的一个 NodeJs 的依赖注入框架。
sactive-web是基于sactive-di的web框架。

Installation

1
npm install sactive-di

Usage

sactive-di目前只支持类的依赖注入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Class1 {
test() {
return 'test';
}
}
class Class2 {
constructor($$class1) {
this.$$class1 = $$class1;
}
test() {
return 'test';
}
}
async function asyncFunc() {
return 'test';
}
class Class3 {
constructor($$class1, $$class2, $$async) {
this.$$class1 = $$class1;
this.$$class2 = $$class2;
this.$$async = $$async;
}
}
const Di = reuqire('sactive-di');
const di = new Di();
di.bindClass('class1', class1);
di.bindClass('class1', Class2);
di.bindClass('Class3', Class3);
di.bindFunction('async', asyncFunc);
let class3 = app.getInstance('$$class3');
class3.$$class2.test() // => 'test'
class3.$$class2.$$class1.test() // => 'test'
class3.$$class1.test() // => 'test'
class3.$$async.then(function(res) {
console.log(res) // => 'test'
});

上面的例子,Class3 注入了三个依赖 $$class1$$class2$$asyncClass2 注入了依赖 $$class1

API

bindClass

绑定类,类在调用该方法之后,可以使用getInstance获取到实例。

1
bindClass(name, class, options);
  • name:String,给绑定的类命名,使用getInstance获取实例时会用到。
  • class:Class,要绑定的类。
  • options:Object,选项:
    • singleton: Boolean,是否是单例,默认是true

注意,绑定的name会自动加上$$符号,获取时要加上$$

1
2
3
4
5
6
7
8
9
10
class Logger {
test() {
return 'test';
}
}
const di = new Di();
di.bindClass('logger', Logger);
let logger = di.getInstance('$$logger') //注意加上`$$`
logger.test() // => 'test'

bindFunction

绑定方法,可以使用getInstance获取到实例,用于依赖注入。
这里获取到的实例并不是function本身,而是它的执行结果,如果只是绑定function,不需要执行它,使用bindInstance

1
bindFunction(name, func, options);
  • name:String,给绑定的方法命名,使用getInstance获取实例时会用到。
  • func:Function,要绑定的方法。
  • options:Object,选项:
    • singleton: Boolean,是否是单例,默认是true

注意,绑定的name会自动加上$$符号,获取时要加上$$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
async function asyncFunc() {
return 'test';
}
function func() {
return 'test';
}
const arrowFunc = () => {
return 'test';
};
const di = new Di();
di.bindFunction('func', func);
di.bindFunction('async', asyncFunc);
di.bindFunction('arrow', arrowFunc);
di.getInstance('$$func') // => 'test'
di.getInstance('$$async') // => 'test'
di.getInstance('$$arrow') // => 'test'

bindInstance

绑定实例,可以使用getInstance获取实例,用于依赖注入。

1
bindInstance(name, instance, options);
  • name:String,给绑定的实例命名,使用getInstance获取实例时会用到。
  • instance:any,要绑定的实例,实例可以是任意类型,stringobjectfunctionclass等。
  • options:Object,选项:
    • singleton: Boolean,是否是单例,默认是true

注意,绑定的name会自动加上$$符号,获取时要加上$$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function func() {
return 'test';
}
class Logger {
test() {
return 'test';
}
}
let student = {
name: 'xiaoming'
};
let name = 'xiaoqiang';
const di = new Di();
di.bindInstance('func', func);
di.bindInstance('logger', Logger);
di.bindInstance('student', student);
di.bindInstance('name', name);
di.getInstance('$$student'); // => {name: 'xiaoming'}
di.getInstance('$$name'); // => 'xiaoming'
di.getInstance('$$func')(); // => 'test'
let logger = new di.getInstance('$$Logger')();
logger.test(); // => 'test'

getInstance

获取实例,用于依赖注入。
注意,绑定的name会自动加上$$符号,获取时要加上$$

1
getInstance(name);
  • name:String,实例名,加上$$

getInstances

获取多个实例,用于依赖注入。
注意,绑定的name会自动加上$$符号,获取时要加上$$

1
getInstances(names);
  • names:Array,一组实例名,加上$$,例如:di.getInstances(['$$logger', '$$test'])

deleteInstance

删除已经绑定的实例。
注意,绑定的name会自动加上$$符号,获取时要加上$$

1
deleteInstance(name);
  • name:String,实例名,加上$$

deleteInstances

删除已经绑定的多个实例。
注意,绑定的name会自动加上$$符号,获取时要加上$$

1
deleteInstances(names);
  • names:Array,一组实例名,加上$$,例如:di.deleteInstances(['$$logger', '$$test'])