1. ホーム
  2. service

[解決済み] AngularJSの非シングルトン・サービス

2023-03-29 15:19:52

質問

AngularJSのドキュメントには、ServiceはSingletonsであると明記されています。

AngularJS services are singletons

逆算して module.factory もシングルトンインスタンスを返します。

シングルトンでないサービスのユースケースがたくさんあることを考えると、サービスのインスタンスを返すファクトリーメソッドを実装する最良の方法は何でしょうか? ExampleService の異なるインスタンスによって満たされます。 ExampleService ?

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

ファクトリーが返すべきは new これは依存性注入を破壊し始め、ライブラリは、特にサードパーティにとって厄介な振る舞いをするでしょうから。要するに、非シングルトン サービスに正当な使用事例があるかどうか、私にはわかりません。

同じことを達成するためのより良い方法は、ゲッターとセッターのメソッドが付けられたオブジェクトのコレクションを返す API としてファクトリーを使用することです。この種のサービスがどのように機能するかを示すいくつかの擬似コードを示します。

.controller( 'MainCtrl', function ( $scope, widgetService ) {
  $scope.onSearchFormSubmission = function () {
    widgetService.findById( $scope.searchById ).then(function ( widget ) {
      // this is a returned object, complete with all the getter/setters
      $scope.widget = widget;
    });
  };

  $scope.onWidgetSave = function () {
    // this method persists the widget object
    $scope.widget.$save();
  };
});

これは、ID によってウィジェットを検索し、レコードに加えられた変更を保存できるようにするための擬似コードです。

これは、サービスのための疑似コードです。

.factory( 'widgetService', function ( $http ) {

  function Widget( json ) {
    angular.extend( this, json );
  }

  Widget.prototype = {
    $save: function () {
      // TODO: strip irrelevant fields
      var scrubbedObject = //...
      return $http.put( '/widgets/'+this.id, scrubbedObject );
    }
  };

  function getWidgetById ( id ) {
    return $http( '/widgets/'+id ).then(function ( json ) {
      return new Widget( json );
    });
  }


  // the public widget API
  return {
    // ...
    findById: getWidgetById
    // ...
  };
});

この例には含まれていませんが、この種の柔軟なサービスは、簡単に状態を管理することもできます。


今は時間がありませんが、もし役に立つのであれば、後で簡単なPlunkerを組み立てて実演することができます。