2016-07-24 8 views
6

角型は、異なるタイプを使用してコンポーネントコンストラクタ間で呼び出された場合、汎用サービスの複数のインスタンスを挿入しますか?角型の汎用サービスの注入

私は、同じ基本クラスからすべて継承する異なるクラスに対して同じ機能を提供することになるサービスがたくさんあります。私はこれを扱うTypescriptの汎用パターンMyService<T extends BaseClass>を使用したいと思います。

しかし、私はそれが角度のインジェクタとjives方法がわからない:それはさまざまな種類の異なるコンポーネントに注入されています場合

  1. 角度インジェクタは、1つのインスタンスこのサービスのより多くを作成するのでしょうか?
  2. 同じタイプで呼び出された場合、インジェクタは同じインスタンスを注入しますか?

コード:

@Injectable 
export class MyService<T> { 
    ... 
} 

@Component 
export class ComponentA { 
    constructor(alphaService MyService<Alpha>) {} <--Instance 1 
} 

@Component 
export class ComponentB { 
    constructor(betaService MyService<Beta>) {} <----Instance 2? 
} 

@Component 
export class ComponentA1 { 
    constructor(alphaService MyService<Alpha>) {} <---Instance 1? 
} 

この法的ですか?注射器はMyServiceの2つのインスタンスを作成することを知っていますか?

答えて

2

ジェネリックスの追加インスタンスは作成されません。 (活字体型注釈をサポートするために、角度2つのデコレータで使用される)herereflect-metadataは、この種の情報を取得できない述べられているとおり

活字体は、実行時に使用可能な種類のタイプのメタデータを放出し、しインターフェースエイリアス、ジェネリックス、またはジェネリックスを出力しません(JavaScript表現を持たないため)。

MyServiceインスタンスの量がMyServiceコンポーネントのプロバイダとして定義された、またはそれが親インジェクタから継承されたかどうかに依存します。上記のコードで

ComponentAComponentA1ComponentBproviders: [MyService]で新しいインスタンスを取得することができ、親インジェクタからMyServiceプロバイダを継承することができます。

9

これはシンプルなソリューションです:useFactoryを通じてモジュールであなたのサービスを設定すると

// service and models 
export class User{ 
    firstName:string 
} 
export class Admin{ 
    lastName:string 
} 

@Injectable() 
export class GenericService<T>{ 
    item:number = Math.random(); 
    GetAll():Array<T> { 
     let output = []; 
     console.log(this.item); // each instance has own value 
     return output; 
    } 
} 

providers: [ 
     {provide:'UserService', useFactory:()=>(new GenericService<User>())}, 
     {provide:'AdminService', useFactory:()=>(new GenericService<Admin>())}, 
    ], 

と@Injectデコレータを使用してサービスを注入:

constructor(@Inject('UserService') private userService:GenericService<User>, 
       @Inject('AdminService') private adminService:GenericService<Admin> 
    ) { } 

を保ちますあなたのpにはInjectionTokenOpaqueTokenは推奨されません)を使用することをお勧めしますrovider token.私は単純にするために文字列を使用しました。

+3

ちょうど注: 'OpaqueToken'は廃止予定です。代わりに[** InjectionToken' **](https://angular.io/docs/ts/latest/api/core/index/InjectionToken-class.html)を使用してください。 – developer033

+0

それでは、この1つのコンストラクタ(private http:HttpClient)のようなコンストラクタの 'HttpClient'(または' HttpModule')オブジェクトをどのように注入しますか? – Bellash

関連する問題