1. ホーム
  2. angularjs

[解決済み] angular.serviceとangular.factoryの比較

2022-03-19 04:19:37

質問

私は、両方の angular.factory() angular.service() はサービスを宣言するために使用されますが、私は を見つけることができません。 angular.service 公式ドキュメントのどこにもない。

この2つのメソッドの違いは何ですか?
どちらを使うべきですか(異なることをするとして)?

どのように解決するのですか?

  angular.service('myService', myServiceFunction);
  angular.factory('myFactory', myFactoryFunction);


このように自分に言い聞かせるまで、この概念を理解するのに苦労しました。

サービス を使用します。 機能 になります。 新しい -ed:

  myInjectedService  <----  new myServiceFunction()

工場 を使用します。 機能 (コンストラクタ)を書くと 呼び出される :

  myInjectedFactory  <---  myFactoryFunction()

それをどうするかはあなた次第ですが、便利なパターンがいくつかありますよ...。

を書くなど。 サービス 関数を使用して、公開 API を公開します。

function myServiceFunction() {
  this.awesomeApi = function(optional) {
    // calculate some stuff
    return awesomeListOfValues;
  }
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();

を使ったり 工場 関数を使って公開APIを公開します。

function myFactoryFunction() {
  var aPrivateVariable = "yay";

  function hello() {
    return "hello mars " + aPrivateVariable;
  }
  
  // expose a public API
  return {
    hello: hello
  };
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();

を使ったり 工場 関数を使用してコンストラクタを返します。

function myFactoryFunction() {
    return function() {
        var a = 2;
        this.a2 = function() {
            return a*2;
        };
    };
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();


どれを使えばいいのか...。

どちらも同じことを実現できます。しかし、場合によっては 工場 を使用すると、よりシンプルな構文でインジェクタブルを作成できるため、少し柔軟性が増します。それは、myInjectedServiceは常にオブジェクトでなければならないのに対して、myInjectedFactoryはオブジェクトでも関数参照でも、あるいはどんな値でも構わないからです。例えば、(上記の最後の例のように)コンストラクタを作成するサービスを書いた場合、このようにインスタンスを作成する必要があります。

var myShinyNewObject = new myInjectedService.myFunction()

というのは、間違いなくこれより望ましくない。

var myShinyNewObject = new myInjectedFactory();

(ただし、そもそもこの種のパターンを使うこと自体に注意が必要で、その理由は 新しい -を使用すると、依存関係を把握しづらくなり、テスト用のモックを作成しづらくなります。を使用するよりも、 サービス側でオブジェクトのコレクションを管理するほうがよいでしょう。 new() を、気ままに。)


もうひとつ、全部Singletonなんですけど...。

また、どちらのケースでも、angularはシングルトンの管理を手助けしていることを心に留めておいてください。サービスや関数をどこで何回インジェクトしようとも、同じオブジェクトや関数への同じ参照を得ることになります。(ファクトリーが単に数値や文字列のような値を返す場合は例外です。この場合、常に同じ値を得ることができますが、参照は得られません)。