再谈angularjs DI(Dependency Injection)

简介:

     在前面已经介绍了关于angularjs,以及扩展了一些jQuery ui的一些组件为angularjs的directive。在这里应进口007 上篇留言我们来看看在angularjs中的DI特性。

    DI:依赖注入,是一种软件设计模式,应DIP依赖倒置原则,描述组件之间高层组件不应该依赖于底层组件。依赖倒置是指实现和接口倒置,采用自顶向下的方式关注所需的底层组件接口,而不是其实现。其应用框架则为IOC,在.net中有很多我们熟悉的IOC框架,如Unity,Castle windsor,Ninject,Autofact等等,其常常分为构造注入,函数注入,属性注。同时在IOC和Service Locator(服务查找),如果你想更多的了解IOC和DI请参见martin fowler的Inversion of Control Containers and the Dependency Injection pattern

     回到angularjs:在框架中为我们提供了angular.injector(modules)DI注入注射器。但是在我们使用注入的时候常常是不需要关心具体的如何注入。我们只需要按照其规则书写我们的angularjs代码就会很容易的得到angularjs的DI特性,DI方式有三种:

1:推断式注入:在angularjs中我们可以在我们需要注入的地方按照名称注入,这里要求参数名称必须和注入服务实例名称相同,一种名称约定。angularjs会提取参数名称查找相应DI实例注入。

例如:

复制代码
 1  var myModule = angular.module('myModule', []);
 2 
 3 myModule.factory('$alert',  function($window) {
 4 
 5      return {
 6         alert:  function(text) {
 7             $window.alert(text);
 8         }
 9     };
10 });
11 
12  var myController =  function($scope, $alert) {
13     $scope.message =  function(msg) {
14         console.log(msg);
15         $alert.alert(msg);
16     };
17 };
18 myModule.controller("myController", myController);​
复制代码

 

在上面实例我利用已知的window服务新建了一个alert的服务.并利用注入到我们的controller使用.这里采用的都是约定注入(根据参数名称注入).

jsfiddle在线演示http://jsfiddle.net/whitewolf/zyA5B/7/

 

2:标记注入:在angularjs中我们可以利用$inject标注DI注入,这里需要注入服务名称的顺序和构造参数名对应.这里可以解决以上约定的死板性.

将上例代码改变为如下:

代码如下:

复制代码
 1 var myModule = angular.module('myModule', []);
 2 
 3 myModule.factory('$alert', ['$window', function($window) {
 4 
 5     return {
 6         alert: function(text) {
 7             $window.alert(text);
 8         }
 9     };}]);
10 
11 var myController = function($scope, $alert) {
12     $scope.message = function(msg) {
13         console.log(msg);
14         $alert.alert(msg);
15     };
16 };
17 myController.$inject = ['$scope', '$alert'];
18 myModule.controller("myController", myController);​
复制代码

 

jsfiddle在线演示http://jsfiddle.net/whitewolf/zyA5B/8/

3:内联注入:对于directives,factory,filter等特殊指令使用$inject标注注入使用不是那么友好,angularjs特别增加了内联注入。如上面的$alert服务     

复制代码
1 myModule.factory('$alert', ['$window',  function($window) { 
2 
3     return { 
4        alert:  function(text) { 
5        $window.alert(text); 
6     } 
7 };}]);
复制代码

 

   在angularjs中我们可以在controller中实用DI特性,同时一些列的工厂方法如directives, services, filters同样可以实用内联注入得到DI特性。

1:在controller中形如:

复制代码
 1  var MyController =  function(dep1, dep2) {
 2 
 3 ...
 4 
 5 }
 6 
 7 MyController.$inject = ['dep1', 'dep2'];
 8 
 9  
10 
11 MyController.prototype.aMethod =  function() {
12 
13 ...
14 
15 }
复制代码

   

2:工厂方法注入形如:

复制代码
 1 angualar.module('myModule', []).
 2 
 3 config(['depProvider',  function(depProvider){
 4 
 5 ...
 6 
 7 }]).
 8 
 9 factory('serviceId', ['depService',  function(depService) {
10 
11 ...
12 
13 }]).
14 
15 directive('directiveName', ['depService',  function(depService) {
16 
17 ...
18 
19 }]).
20 
21 filter('filterName', ['depService',  function(depService) {
22 
23 ...
24 
25 }]).
26 
27 run(['depService',  function(depService) {
28 
29 ...
30 
31 }]);
复制代码

 


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2012/09/11/2680659.html


相关文章
|
4月前
|
设计模式 前端开发 测试技术
AngularJS 的依赖注入机制是怎样的?
AngularJS 的依赖注入机制是怎样的?
50 1
|
7月前
|
JavaScript
Angular @Inject 注解的实际应用例子和工作原理浅析
Angular @Inject 注解的实际应用例子和工作原理浅析
34 0
|
7月前
|
编译器
Angular 依赖注入机制实现原理的深入介绍
Angular 依赖注入机制实现原理的深入介绍
24 0
|
设计模式 容器
AngularJS实战之依赖注入与应用实践
AngularJS实战之依赖注入与应用实践
AngularJS实战之依赖注入与应用实践
Angular里遇到的一个依赖注入问题以及解决办法
Angular里遇到的一个依赖注入问题以及解决办法
Angular里遇到的一个依赖注入问题以及解决办法
|
存储 JavaScript
Angular依赖注入官方文档的学习笔记
Angular依赖注入官方文档的学习笔记
Angular依赖注入官方文档的学习笔记
|
JavaScript 前端开发
Angular 为什么要引入 injection token 的概念
Angular 为什么要引入 injection token 的概念
119 0
Angular 为什么要引入 injection token 的概念
Angular 依赖注入 UseClass 和 UseExisting 的区别
Angular 依赖注入 UseClass 和 UseExisting 的区别
114 0
Angular 依赖注入 UseClass 和 UseExisting 的区别
|
JavaScript API
Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
280 0
Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
|
JavaScript 程序员
Angular 通过依赖注入机制注入一个对象的例子,什么是 ElementInjector
Angular 通过依赖注入机制注入一个对象的例子,什么是 ElementInjector
111 0
Angular 通过依赖注入机制注入一个对象的例子,什么是 ElementInjector

热门文章

最新文章