1.依赖注入
依赖注入式实现控制反转的一种软件设计模式,即将被依赖的对象传递给依赖者,而不需要依赖者自己去创建和查找所需对象。
具体在angular中,依赖注入指的就是当一个控制器需要传入一个服务时,不需要他自己去实现化这个服务,而是由依赖注入器来分析这个服务的依赖,来实例化这个服务,并传入控制器中。
2.简单实现
首先需要实现一个依赖注入器,负责管理各个服务之前的依赖和构造关系,同时包含有一个注册函数,负责注册构造函数和依赖,和一个注入函数负责实例化服务。
//依赖注入器
function Injector(){
this.service={};
}
Injector.prototype={
//注册服务方法
regist: function(name,fn,depends){
//管理依赖的容器
this.service[name]={
constructor: fn,
depends: depends
};
},
//注入方法
inject: function(name){
var self=this;
(function ready(na){
if(!self.service[na].depends){
return self.service[na].constructor();
}
else{
var args=[];
self.service[na].depends.forEach(function(item){
args.push(ready(item));
});
return self.service[na].constructor.apply(null,args);
}
})(name);
}
};
实现思路就是每次需要注入一个服务时,递归地查找他的依赖项进行实例化。
这个依赖注入器的使用方法如下:
var injector=new Injector();
//注册name服务,依赖于color服务
injector.regist('name',function(color){
console.log(color.ready);
},['color']);
//注册color服务
injector.regist('color',function(){
return {
ready: 'green'
};
});
//注入name服务
injector.inject('name');