2016-09-22 25 views
1

私のストレージプロバイダ用のドライバシステムをセットアップしています。AngularJS動的依存性注入

私は非常に基本的なストレージプロバイダを持っている:

このように構成されて
angular.module('mooseGarden').provider('storage', function() { 

    var storage = this; 
    var driverName; 

    this.setDriverName = function(name) { 
     driverName = name; 
     return storage; 
    }; 

    this.getDriverName = function() { 
     return driverName; 
    }; 

    this.$get = [driverName, function(driver) { 

     return { 
      set: function(key, value) { 
       driver.set(key, value); 
      }, 
      get: function(key) { 
       driver.get(key); 
      } 
     }; 
    }]; 
}); 

StorageDriver_LocalStorageがアプリケーションのどこかに定義されて

app.config(['storageProvider', function(storageProvider) { 
    storageProvider.setDriverName('StorageDriver_LocalStorage'); 
}]); 

を。

プロバイダ

あなたは注入するサービスとして設定されている変数driverNameに気づきます。ドライバーがAngularアプリケーションのサービスになるようにしたい。それがもたらす「きれいで美しい」方法を超えて、私はまた、それらのドライバを他のモジュールからインポートし、使用するドライバとしてプログラム的に定義することを望んでいます。

この設定の問題点は何ですか?

storageProviderは、コンフィグブロックの依存関係です。私はプロバイダがオブジェクトのようにロードされることを期待しました/ $getメソッドは呼び出されません。 そうでない場合は、$getが呼び出されます。ドライバサービスは、プロバイダの依存関係であり、アプリケーションが停止しています。

プロバイダの目的はすべて、使用前に設定できるということですが、インスタンス化せずに取得することはできないため、これはちょっとばかりです。私はどこかに混乱していると思う...

誰もこれを解決する方法を知っていますか?

答えて

2

問題は、$ getが実行されたことではありません。Angularは、$ getに送信する依存関係をすでに把握しています。

代わりに使用する必要があるのはAngular's $injector service(具体的なgetメソッド)です。

var driver = $injector.get(driverName); 

私は証明するために一緒にquick Plnkrを投げました。

+0

この方法を試してみました。私は 'storageProvider.setDriverName( 'StorageDriver_LocalStorage');でドライバ名のスペルを間違えてしまった。 – JesusTheHun