2016-06-23 7 views
1

角度typescriptです内のコンポーネントに、実行時にサービスを作成し、配線するためにここに私のユースケースです:はどのように手動で2

私は4つの異なる実装WorkflowAWorkflowBWorkflowCWorkflowDとのインタフェースを持っています。 (?Factoryパターン)

export interface IWorkflow { 
    getQuestions(); 
    validateQuestions(); 
    getWorkflowSteps(); 
} 

Iは入力変数に基づいて適切なワークフローを返すWorkflowManagerクラスを有する

export class WorkflowManager { 

    workflow:IWorkflow; 

    getWorkflow(workflow){ 
    switch (workflow) { 
     case 'workflowA': 
     return new workflowA(); 
     case 'workflowB': 
     return new workflowB(); 
     case 'workflowC': 
     return new workflowC(); 
     case 'workflowD': 
     return new workflowD(); 
     default: 
     throw new Error(`Unrecognized workflow: ${workflow}`); 
    } 
    } 

} 

Iはまた

例ロードされるコンポーネントWorkflowComponent有する: を/workflow=WorkflowAロードWorkflowComponent。次に、コンポーネントはrouteparam workflowを抽出し、その値に基づいて適切なワークフローを返すWorkflowManagerに渡します。

は、ここに私のコンポーネント

@Component({ 
... 
}) 

export class Workflow implements OnInit { 

    workflowInstance: IWorkflow; 

    constructor(
    private route: ActivatedRoute, 
    private workflowManager: WorkflowManager, 
) { 

    } 

    ngOnInit() { 
    this.route.params.subscribe(params => { 
     let regType: string = params['workflow']; 
     this.workflowInstance = this.workflowManager.getWorkflow(workflow); 
    }); 
    } 

} 

の抜粋だが、私は手動でWorkflow*のクラスをインスタンス化のアイデアを好きではありません。これを改善して、Angular2が提供するAPIを使用してワイヤリングすることで、他のコンポーネントに管理/注入することができます。

私の現在の実装では、Angularフレームワークの外でajax呼び出しを行う必要があります。私はこれを行うのが最善ではないと思います。

角度フレームワークを利用してこれを改善する方法に関するアイデアはありますか?

答えて

1

一つの方法は、注射器を注入し、命令的のようなワークフローインスタンスを取得することです。また、あなたがworkflowAworkflowBworkflowCworkflowAを注入することができ、ちょうどworkflowに応じて、正しいものを返す

@Injectable() 
export class WorkflowManager { 
    constructor(private injector:Injector) {}  

    workflow:IWorkflow; 

    getWorkflow(workflow){ 
    switch (workflow) { 
     case 'workflowA': 
     return this.injector.get(workflowA); 
     case 'workflowB': 
     return this.injector.get(workflowB); 
     case 'workflowC': 
     return this.injector.get(workflowC); 
     case 'workflowD': 
     return this.injector.get(workflowD); 
     default: 
     throw new Error(`Unrecognized workflow: ${workflow}`); 
    } 
    } 
} 

が、私は思いますインジェクタを使用する方がこの使用例に適しています。

workflowAworkflowBworkflowCをご提供ください。

+0

ありがとうございました。とにかくこれをさらに改善するには、すべてをインスタンス化せず、毎回必要なものだけをインスタンス化します。 – user6123723

+0

あなたは何を意味するか分かりません。上記のコードは、 'workflow'パラメータによって明示的に要求されるものだけをインスタンス化します。すべてのDIを使用してコンストラクタパラメータを使用してインスタンスを挿入すると、すべてを一度にインスタンス化します。 –

+0

返されたthis.injector.get(workflowA)は、このクラスで既に宣言されているインスタンスである 'workflowA'(単語の先頭に小文字の「w」があることに注意してください)ですか?どのように角度選択WorkflowAクラスは 'workflowA'からthis.injector.get(workflowA)文を返しますか?ありがとうございました。 – user6123723

関連する問題