SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

次世代Webアプリケーションフレームワーク「Angular」の活用

ロジックを画面から分離できる「Angular 2」のサービスと依存性注入

次世代Webアプリケーションフレームワーク「Angular」の活用 第4回


TypeScriptクラスをサービスにする依存性注入(2)

その2:コンポーネント内だけで利用するサービス

 特定のコンポーネント内だけで利用するサービスを定義することもできます。例として、会社名を修正する機能を提供する、リスト6のCorrectorクラスをサービスにしていきます。

リスト6 会社名修正クラス(angular2-005-services/app/phoneutil/corrector.service.ts)
// InjectableデコレーターとLoggerサービスクラスの参照 ...(1)
import { Injectable } from "@angular/core";
import { Logger } from "../logger.service";

// 会社名の修正を行うサービス ...(2)
@Injectable()
export class Corrector {
  // 修正に用いる会社名の対照表 ...(3)
  private vendorCorrectionList = {
    "アスース": "エイスース",
    "エイサス": "エイスース",
    "サムソン": "サムスン"
  };

  // コンストラクター ...(4)
  constructor(private logger:Logger) {
  }

  // 会社名の誤記を修正 ...(5)
  correctVendor(vendor: any) {
    // ログ出力 ...(6)
    this.logger.d("Corrector", "vendor= " + vendor);
    // 対照表を検索
    var convertedVendor:any = this.vendorCorrectionList[vendor];
    // 対照表に存在しなければ入力された会社名をそのまま設定
    if (!convertedVendor) {
      convertedVendor = vendor;
    }
    // 会社名を返却
    return convertedVendor;
  }
}

 (1)では@Injectableデコレーターと、このサービスで利用するLoggerサービスのクラスを参照しています。クラス定義は(2)以降です。会社名の誤りと正しい値を(3)の対照表に定義しています。(4)のコンストラクターでLoggerサービスのインスタンスloggerを受け取ります(Loggerサービスはリスト4で説明したとおり、Webページ実装のあらゆる場所から利用できます)。

 修正処理の実体は(5)のcorrectVendorメソッドで、入力された会社名が対照表に含まれるときは修正して戻します。なお(6)では、依存性注入で受け取ったLoggerサービスでログ出力をしています。

 リスト6のクラスを、入力を行う項目追加コンポーネント(phoneinput.component.ts)だけにサービスとして登録して、図3のように入力された会社名を修正できるようにします。

図3 入力された会社名をCorrectorサービスで修正(angular2-005-services)
図3 入力された会社名をCorrectorサービスで修正(angular2-005-services)

 まず、項目追加コンポーネントの定義ファイル(phoneinput.component.ts)に、リスト7のようにサービスを登録します。

リスト7 項目追加コンポーネントへのサービス登録
(angular2-005-services/app/phoneutil/phoneinput.component.ts)
// サービスにするクラスの参照 ...(1)
import { Corrector } from "./corrector.service"
import { Logger } from "../logger.service"

// コンポーネントのメタデータ定義 ...(2)
@Component({
  //...(略)...
  providers:  [ Corrector ] // Correctorクラスをサービスとして登録
})

 (1)でサービスに登録するCorrectorクラスを参照します。なお、Loggerは後で利用するため、ここで参照しています。次に、(2)のように、コンポーネントのメタデータを記述する@Componentデコレータのproviders属性にCorrectorクラスを指定します。providers属性の意味や記法はモジュールに指定する場合(リスト4)と同じです。この記述で、Correctorクラスがサービスとして登録されます。

 サービスを利用する記述はリスト8のようになります。

リスト8 Correctorサービスの利用(angular2-005-services/app/phoneutil/phoneinput.component.ts)
// コンポーネントクラス定義
export class PhoneInputComponent {
  //...(略)...
  /**
   * コンストラクター ...(1)
   * 依存性注入でcorrectorとloggerオブジェクトを受け取る
   */
  constructor(
    private corrector:Corrector,
    private logger:Logger) {
  }

  /**
   * 追加ボタンクリック時のハンドラ
   */
  onClick() {
    // Correctorサービスで、会社名を修正 ...(2)
    this.newPhone.vendor 
    = this.corrector.correctVendor(this.newPhone.vendor)
    // Loggerサービスで、修正後の会社名をログ出力 ...(3)
    this.logger.d("PhoneInput", this.newPhone.vendor);
    //...(略)...
  }
}

 (1)のコンストラクターで、引数correctorにCorrectorクラスのインスタンスが渡されます。受け取ったCorrectorサービスのインスタンスを(2)で「this.corrector」で参照して、フォームに入力された会社名を修正しています。また(3)で、Loggerサービスによるログ出力を行っています。

 リスト6~8を実装してWebページを表示し、会社名に「アスース」と入力してスマートフォンを登録すると、図3のように会社名が「エイスース」と自動的に修正されます。

 リスト8では、(1)でLoggerクラスのインスタンスを引数loggerに受け取って(3)で利用しています。Loggerクラスはリスト4でモジュールにサービス登録されているので、Webページ実装のあらゆる場所から利用できます。一方、リスト7のように特定のコンポーネントにクラスをサービス登録すると、登録したコンポーネントのインスタンスごとにサービスクラスのインスタンスが共有され、ほかのコンポーネントからは利用できなくなります。

まとめ

 本記事では、前回記事の続きとして、Angular 2で自作のコンポーネントをモジュールにまとめる方法を紹介するとともに、共通ロジックなどをコンポーネントと独立して実装できるサービスと、サービスを利用するための依存性注入について説明しました。

 サービスと依存性注入を活用すれば、ロジックをサービスに実装してコンポーネントから分離できるため、モジュールの仕組みとあわせて、プログラムの部品化をより進めることができます。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
次世代Webアプリケーションフレームワーク「Angular」の活用連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト  吉川 英一(ヨシカワ エイイチ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9779 2017/04/24 11:02

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー