2016-07-21 14 views
0

Ich bin ziemlich vertraut mit Abhängigkeitsinjektion und Inversion der Kontrolle in verschiedenen Sprachen und als Konzepte. Ich kann mich jedoch nicht dazu durchringen, ein Muster wie im folgenden Beispiel mit den besten Praktiken von AngularJS zu erreichen.Abhängigkeitsinjektion und Inversion der Kontrolle in AngularJS

Ich versuche, eine Objekt-Registrierung zu erstellen, in der Objekte hinzugefügt und später durch einen Schlüssel abgerufen werden können.

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)); 

Das Problem ist, dass ObjectRegistry nie da ObjectInstance bevölkert wird nie initialisiert (und ich will nicht von der Steuerung zu tun haben).

Was wäre der beste Ansatz, um dies in Angular zu erreichen? Ich kenne zum Beispiel Symfonys DI-Container und Compiler-Pässe, die es erlauben, dieses Muster zu replizieren, aber ich bin mir nicht sicher, wie ich es mit Angulars DI machen soll.

+0

Warum Möchten Sie eine zweite Registrierung? – zeroflagL

+0

Viele Gründe, der aktuelle Anwendungsfall ähnelt einer Plugin-Registry. –

Antwort

0

So für die Nachwelt, ich es endlich geschafft, eine Lösung zu finden, die meine Anforderungen entspricht, indem Sie die Konfigurationsphase mit und einen Service-Provider:

(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)); 

Und wo auch immer in meinem Code:

(function (angular) { 
    'use strict'; 

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