1. ホーム
  2. angular

[解決済み] コンポーネントではなくクラスにサービスをインジェクトする方法

2022-12-19 08:21:01

質問

あるサービスにインジェクトしたいのですが、そのクラスは コンポーネントではなく .

例えば

マイサービス

import {Injectable} from '@angular/core';
@Injectable()
export class myService {
  dosomething() {
    // implementation
  }
}

MyClass

import { myService } from './myService'
export class MyClass {
  constructor(private myservice:myService) {

  }
  test() {
     this.myservice.dosomething();
  }
}

試してみましたが、うまくいきません。serviceはコンポーネントかサービスのみで使用する必要があるようです。

普通のクラスでサービスを使う方法はありますか? それとも普通のクラスでサービスを使うのは悪いことですか?

ありがとうございます。

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

インジェクションは、Angularsの依存性注入(DI)によってインスタンス化されたクラスに対してのみ機能します。

  1. 必要なのは
    • 追加する @Injectable()MyClass であり
    • 提供する MyClass のように providers: [MyClass] のように、コンポーネントまたは NgModule の中に記述します。

次に MyClass をどこかに注入すると MyService のインスタンスが MyClass に渡されます。

  1. のようなカスタムインジェクタを設定する方法もあります。
constructor(private injector:Injector) { 
  let resolvedProviders = ReflectiveInjector.resolve([MyClass]);
  let childInjector = ReflectiveInjector.fromResolvedProviders(resolvedProviders, this.injector);

  let myClass : MyClass = childInjector.get(MyClass);
}

このように myClassMyClass のインスタンスで、Angulars DIによってインスタンス化されます。 myService に注入されます。 MyClass に注入されます。

参照 ディレクティブの中で手動でInjectorから依存性を取得する

  1. さらにもう一つの方法は、自分でインスタンスを作成することです。
constructor(ms:myService)
let myClass = new MyClass(ms);