2016-07-21 82 views
0

我很熟悉各种语言和概念中的依赖注入和控制反转。然而,我不能通过使用AngularJS最佳实践来获得类似以下示例的模式。AngularJS中的依赖注入和控制反转

我想创建一个对象注册表,其中可以添加对象并在稍后通过一个键获取对象。

function (angular) { 
    'use strict'; 

    angular.module('sample') 
     .service('ObjectRegistry', function() { 
      var members = []; 

      this.addMember = function(key, object) { 
       members[key] = object; 
      } 

      this.getMember = function(key) { 
       return members[key] || {}; 
      } 
     }) 
     .service('ObjectInstance', [ 'ObjectRegistry', function (ObjectRegistry) { 

      this.doSomething = function() {}; 

      ObjectRegistry.addMember("my-key", this); 
     }]) 
     .controller('MyController', [ 'ObjectRegistry', function (ObjectRegistry) { 

    // Here I need to get ObjectRegistry populated with all services that register themselves in the registry, in this example, with ObjectInstance under the key "my-key" 

     }); 

}(angular)); 

的问题是,ObjectRegistry类是从来没有填充因为ObjectInstance从未初始化(我不希望有来自控制器做)。

什么是在Angular中实现这一点的最佳方法?例如我熟悉Symfony的DI容器和编译器通行证,可以复制这种模式,但我不太确定如何使用Angular的DI。

+0

为什么你想要第二个注册表吗? – zeroflagL

+0

许多原因,目前的用例与插件注册表类似。 –

回答

0

因此,对于后人,我终于发现,通过配置相位和服务提供商适合我的需求的解决方案:

(function (angular) { 
    'use strict'; 

    angular.module('sampleApp', []) 
     .provider("ObjectRegistry", function() { 
      var objects = {}; 

      return { 
       bind: function (name, object) { objects[name] = object; }, 
       $get: function() { 
        return { 
         get: function (name) { return objects[name]; } 
        }; 
       } 
      }; 
     }); 
}(angular)); 

而且在我的代码任何其他地方:

(function (angular) { 
    'use strict'; 

    angular.module('sampleApp') 
     .config(function (ObjectRegistryProvider) { 
      ObjectRegistryProvider.bind("my-key", { }); 
     }); 
}(angular));