分享人:陈静雯
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。 该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦合,并遵循了依赖反转和单一职责原则。与服务定位器模式形成直接对比的是,它允许客户端了解客户端如何使用该系统找到依赖
在Angular中,依赖注入可谓无孔不入。通常在两种场景(函数)下会使用到依赖注入:
工厂方法定义的组件(components):如directive,factory,filter,provider,controller等。这些工厂函数需要注册到某个模块上。controller比较特殊,它虽然也是一种组件,但是特别之处是它与某个DOM元素关联,因此可以注入$scope service,而其他组件只能注入$rootScope service。
模块提供的run/config方法。
AngularJS 提供很好的依赖注入机制。constant,value,factory,service和provider5个核心组件用来作为依赖注入。
在Angular中,factory,service和value本质上都是一种provider,Angular会执行如下代码定义这些provider:
myApp.config(function($provide) {
$provide.provider('sayHello', function() {
this.$get = function() {
return function(name) {
alert("Hello, cat " + name);
};
};
});
});
myApp.factory("sayHello", ...);
myApp.service("sayHello", ...);
myApp.value("Cat", ...);
所有的供应商都只被实例化一次,也就说他们都是单例的
除了constant,所有的供应商都可以被装饰器(decorator)装饰
value就是一个简单的可注入的值
service是一个可注入的构造器
factory是一个可注入的方法
decorator可以修改或封装其他的供应商,当然除了constant
provider是一个可配置的factory
Angular在加载模块时经过两个阶段:config和run。传入config函数的方法会在当前模块加载时执行;传入run函数的方法会在所有模块加载结束后执行。因此,在config阶段即可配置多个provider,但是在config阶段,只有provider可以注入,因此自定义的service无法注入到config中。这也好理解,因为config阶段是对service进行配置的而不是使用service本身。
显式注入声明
var MyController = function($scope, greeter) {
// ...
}
MyController.$inject = ['$scope', 'greeter'];
someModule.controller('MyController', MyController);
行内注入声明
someModule.controller('MyController', ['$scope', 'greeter', function($scope, greeter) {
// ...
}]);
推断式注入声明
someModule.controller('MyController', function($scope, greeter) {
// ...
});
与不用依赖注入的其他框架相比,有何优点?
高内聚,低耦合。耦合性非常低,也就是说每个对象都可以轻易被替换而不影响其他对象。
参考1: 理解angularjs中的依赖注入
参考2: 深入理解angular依赖注入
感谢大家观看
BY : 陈静雯