LoginSignup
1
0

More than 3 years have passed since last update.

AngularJSでDIを必要とする状態を持つオブジェクトを生成する

Last updated at Posted at 2019-05-24

Angular ではなく、未だに AngularJS と戦う同志に捧ぐ。

以下のような service で実装された ServiceA ServiceB に依存し、かつ状態を持つオブジェクトをAngularJSで実装するためのテクニックの共有です。

class ModelA {
  constructor(ServiceA, ServiceB, state) {
    this.ServiceA = ServiceA;
    this.ServiceB = ServiceB;

    this.state = state;
  }
}

AngularJSの提供する service factory はシングルトンオブジェクトを返す仕組なので状態を持つオブジェクトの生成には利用できません。
仕方なくコントローラーに該当オブジェクトの生成に必要な依存オブジェクトをDIしてコントローラー内で生成するという方法しかできません。
画面数、component数が多いとコントローラーに膨大な依存オブジェクトのDIの記述が並び、重複したコードが至るところに出現してメンテナンス性を下げます。

以下のような service を導入することでこの問題を解決することができます。
上記の ModelA を必要なコントローラーは FactoryService をDIして createModelA 関数を実行すれば ModelA のインスタンスを生成して利用できます。

class FactoryService {
  constructor(ServiceA, ServiceB) {
    'ngInject';
    this.ServiceA = ServiceA;
    this.ServiceB = ServiceB;
  }

  createModelA(state) {
    return new ModelA(this.ServiceA, this.ServiceB, state);
  }
}

app.service('FactoryService', FactoryService);

この実装パターンの利点は文脈に応じたインスタンス生成が実現できることです。
インスタンス生成の関数に文脈を表現する引数を追加することで生成するインスタンスを複数の候補から選択することができるよになります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0