albatrosary's blog

UI/UXとエンタープライズシステム

Dependency injection tokens

Angular2のDIはtokenを使います。Angular1では文字列をベースとしたDIを行っていましたが大幅に仕組みが異なります。という話ですが、tokenってなに?なに様のつもりなのさ。ということで調べる。

f:id:albatrosary:20160416090157p:plain

まだ酒巻師匠に話を聞き、ソースを読んでいる最中なのでこまい話は後日になる。

# 一般的な「トークン」という単語

e-words.jp

これによると意味は3つ

  1. プログラミングでは、ソースコードを解析する際にそれ以上細かい単位に分解できない文字列の並びの最小単位(要素名や演算子など)のことをトークンという。
  2. ネットワーク制御で、ネットワーク上を周回する送信権を意味する特殊な信号やデータをトークンということがある。
  3. セキュリティ分野では、ユーザ認証のためにコンピュータのUSBコネクタなどに物理的に接続する小型の装置(セキュリティトークン)のことを略してトークン(あるいはUSBトークンなど)と呼ぶことがある。

Angular2で言っているのは(1)に近いが、たぶんAngular2用語だと思ったほうが良さそう(今のところ)。最初tokenと言われ「?」が10個くらい付いた。

これから調べること

  • tokenと言っているのは、ただのクラス(TypeScriptの)とか文字列とかうつわのこと
  • DIのオブジェクトはTypeScriptのenumで管理されているよう
  • tokenは結構複雑な構造

でこのあたりを読む

https://angular.io/docs/ts/latest/guide/dependency-injection.html https://github.com/angular/angular/blob/master/modules/angular2/src/core/di/provider.ts

ソースを読むとやたらDI tokenという言葉が出てくる。で探していくと

  constructor(token, {useClass, useValue, useExisting, useFactory, deps, multi}: {
    useClass?: Type,
    useValue?: any,
    useExisting?: any,
    useFactory?: Function,
    deps?: Object[],
    multi?: boolean
  }) {
    this.token = token;
    this.useClass = useClass;
    this.useValue = useValue;
    this.useExisting = useExisting;
    this.useFactory = useFactory;
    this.dependencies = deps;
    this._multi = multi;
  }

という感じなのでtokenと読んでいる箱にServiceとか入れてオプションの

  • useClass?: Type,
  • useValue?: any,
  • useExisting?: any,
  • useFactory?: Function,

で利用方法を分けているのだと思う。Angular Cheat Sheet - tsの「Dependency injection configuration」に書かれている例を見てみる

  • provide(MyService, {useClass: MyMockService}) - Sets or overrides the provider for MyService to the MyMockService class.
  • provide(MyService, {useFactory: myFactory}) - Sets or overrides the provider for MyService to the myFactory factory function.
  • provide(MyValue, {useValue: 41}) - Sets or overrides the provider for MyValue to the value 41.