2016-07-21 3 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 никогда не инициализируется (и я не хочу, чтобы сделать из контроллера).

Что было бы лучшим подходом для достижения этого в угловом? Я знаком, например, с контейнером DI-контейнера Symfony и компиляторами, которые позволяют реплицировать этот шаблон, но я не слишком уверен в том, как идти на него с DI-модулем Angular.

+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)); 
Смежные вопросы