2016-07-21 9 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)); 

問題はのObjectInstanceが初期化されることはありませんので、ObjectRegistryが取り込まれることはありません(と私は、コントローラから行う必要がしたくない)ということです。

角度でこれを達成するには、どのような方法が最適でしょうか?たとえば、SymfonyのDIコンテナやコンパイラパスでは、このパターンを複製することができますが、AngularのDIを使用する方法についてはあまりよく分かりません。

+0

なぜ2番目のレジストリが必要ですか? – 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));