2017-01-04 11 views
1

モジュールに応じて、汎用サービスクラスと特殊サービスクラス、共通コンポーネントのいずれかを使用する必要があります。依存性注入中にクラスを特化する

私はUpdateFormComponentSharedModuleを持っています - アプリケーションの他のすべてのモジュールに共通です。インスタンス化中に私はAbstractSaveService - Module1SaveServiceModule2SaveServiceの子孫を渡す必要があります。これらのサービスは他のモジュールModule1Module2で宣言されています。私はModule1UsersComponent)からページとユーザーの押しボタンを示していた場合

ので、ファイル構造は、私が見せたい

\shared\shared.module.ts 
     update.form.component.ts 
     abstract.service.ts 
\module1\save1.service.ts (extends AbstractSaveService) 
     users.component.ts (use UpdateFormComponent and Module1SaveService) 
\module2\save2.service.ts (extends AbstractSaveService) 
     cameras.component.ts (use UpdateFormComponent and Module2SaveService) 
@Component({ 
    selector: 'update-form-component' 
}) 
class UpdateFormComponent { 
    constructor (private s: AbstractSaveService) {} 
} 
@Component({ 
    selector: 'users-component', 
    template: '<update-form-component></update-form-component>' // inject Module1SaveService 
}) 
export class UsersComponent {} 
@Component({ 
    selector: 'cameras-component', 
    template: '<update-form-component></update-form-component>' // inject Module2SaveService 
}) 
export class CamerasComponent {} 

だろうUpdateFormComponent注射したModule1SaveService。私がModule2CamerasComponent)からページを表示しているときに、ユーザがボタンを押すとUpdateFormComponentModule2SaveServiceが表示されます。どうすればこれを達成できますか?

+0

、プログラムでは、作成したいクラスknowningの彼らの方法ですか?グローバル変数に応じて、別のサービス値.... 2つのインスタンスが同じホストコンポーネント内に作成されていますか?または2つの異なるホストで? – Melou

+0

@Melou私はあなたに答えて私の質問を編集しました。 – koral

+0

ありがとうございます。 @Gunter Zochbauerの答えはあなたにはいいですか?そのため、2つのインスタンスが同じホストコンポーネント内に作成されているかどうかを確認する必要がありました。 – Melou

答えて

1

あなたは他のMyComponentの親のプロバイダに1 MyComponentSpecial2Serviceの親のプロバイダにSpecial1Serviceを追加することができます。つまり、これは、両方のコンポーネントが異なる親を持つ場合にのみ機能します。

@Component({ 
    selector: 'parent1', 
    providers: [{provide: GeneralService, useExisting: Special1Service}], 
    template: `<my-component></my-component>` 
}) 
export class Parent1Component { 
    constructor(private generalService:GeneralService) {} 
} 
@Component({ 
    selector: 'parent2', 
    providers: [{provide: GeneralService, useExisting: Special2Service}], 
    template: `<my-component></my-component>` 
}) 
export class Parent1Component { 
    constructor(private generalService:GeneralService) {} 
} 
@NgModule({ 
    providers: [Special1Service, Special2Service] 
    ... 
}) 
export class AppModule {} 
+0

DIを使って可能なことに関する十分な情報が私の回答に含まれるべきだと思います。私はあなたが両方のサービスを注入し、使用するコンポーネント(または同様のアプローチ)を決定するだけでよいと思います。 DIはあなたが望むものを提供しません。 –