構文です。module.service( 'serviceName', function );
結果です。serviceNameを注入可能な引数として宣言した場合、その関数のインスタンスが提供されます。言い換えるとnew FunctionYouPassedToService()です。
ファクトリー
構文です。module.factory( 'factoryName', function );
結果です。factoryNameを注入可能な引数として宣言すると、module.factoryに渡された関数参照を呼び出したときに返される**値が提供されます。
プロバイダ
構文を示します。module.provider( 'providerName', function );
結果です。providerNameを注入可能な引数として宣言すると、** (new ProviderFunction()).$get()が提供されます。コンストラクタ関数は$getメソッドが呼ばれる前にインスタンス化されます。ProviderFunctionはmodule.providerに渡される関数参照です。
AngularJSのメーリングリストから、サービス、ファクトリー、プロバイダー、そしてそれらのインジェクションの使い方を説明した素晴らしいスレッドを入手しました。回答をまとめてみました。
サービス
構文です。
module.service( 'serviceName', function );
結果です。serviceNameを注入可能な引数として宣言した場合、その関数のインスタンスが提供されます。言い換えると
new FunctionYouPassedToService()
です。ファクトリー
構文です。
module.factory( 'factoryName', function );
結果です。factoryNameを注入可能な引数として宣言すると、module.factoryに渡された関数参照を呼び出したときに返される**値が提供されます。
プロバイダ
構文を示します。
module.provider( 'providerName', function );
結果です。providerNameを注入可能な引数として宣言すると、**
(new ProviderFunction()).$get()
が提供されます。コンストラクタ関数は$getメソッドが呼ばれる前にインスタンス化されます。ProviderFunction
はmodule.providerに渡される関数参照です。プロバイダは、モジュールのコンフィギュレーションの段階で設定できるという利点があります。
提供されているコードについては、ここを参照してください。
また、Misko氏による素晴らしい解説もあります。
この場合、インジェクターは単に値をそのまま返します。しかし、値を計算したい場合はどうしますか?その場合は、ファクトリー
つまり、
factory
は値の作成を担当する関数です。ファクトリー関数は、他の依存関係を求めることができることに注意してください。しかし、もっとOO的になりたいと思って、Greeterというクラスがあったらどうでしょう?
インスタンス化するには、次のように書かなければなりません。
そして、次のようにコントローラで 'greeter'を求めることができます。
しかし、これはあまりにも語弊があります。もっと短い書き方は、
provider.service('greeter', Greeter);
です。しかし、もしインジェクションの前に
Greeter
クラスを設定したいとしたらどうでしょうか。その場合は次のように書きます。すると、こんなことができます。
余談ですが、
service
、factory
、value
はすべてproviderから派生したものです。[JS Fiddle Demo][1].
" Hello world "
factory
/service
/provider
を使った例です。プロバイダーを使ってみて、面白いことに気がつきました。
インジェクションの可視性は、プロバイダの場合、サービスやファクトリの場合とは異なります。AngularJSの"constant"(例えば、
myApp.constant('a', 'Robert');
)を宣言すると、それをサービス、ファクトリー、プロバイダに注入することができます。しかし、AngularJSの"value"を宣言した場合(例えば、
myApp.value('b', {name: 'Jones'});
)、サービスやファクトリには注入できますが、プロバイダ作成関数には注入できません。ただし、プロバイダ用に定義した$get
関数には注入することができます。これはAngularJSのドキュメントにも記載されていますが、見落としがちです。プロバイダのページのvalueメソッドとconstantメソッドのセクションに記載されています。http://jsfiddle.net/R2Frv/1/