2015-12-21 9 views
10

私はいくつかの構成値を含むために "定数"クラスが必要なプロジェクトを作成しています。ここでは、このクラスの抽出物である:私は角2を持つコンポーネントでいる時インジェクションとグローバルな静的クラス(Angular 2)

export class Constants 
{ 
    static Configuration = class 
    { 
     static CookieName:string = 'etl_language'; 
    }; 

    ... 

    static View = class 
    { 
     static Militaries:string = 'militaries'; 
     static Mutants:string = 'mutants'; 
     static Objects:string = 'objects'; 
     static Scientists:string = 'scientists'; 
    }; 
} 

、私はそれをインポートして、そのクラスを使用することができます。

import {Constants} from "../../misc/constants"; 

そして、それを参照します。

this.cookieName = Constants.Configuration.CookieName; 

これはかなりうまく動作しますが、コンストラクタでそのクラスへの参照を挿入するためにAngular 2の依存性注入エンジンを使用する必要があると感じていますが、ちょっと残酷すぎます。しかし、私は、私が自分の解決策に固執できるのか、DIを使わなければならないのか分かりません。

アドバイスはありますか?

+1

DIを使用すると、すべての静的なものを取り除き、どこでも同じオブジェクトインスタンス(シングルトン)を注入できます。 –

答えて

6

私が代わりにやっては読み取り専用のプロパティを持っているあなたのConstantsクラスを変更し、そう

ようにそれらから Providers[]を作成であることを示唆しているかもしれないもの
@Injectable() 
public class ConfigurationConstants() { 
    private _cookieName:string = 'etl_language'; 
    ... 
    get cookieName():string { 
    return this._cookieName; 
    } 
    ... 
} 

export var CONSTANTS_PROVIDERS:Provider[] = [ 
    provide(ConfigurationConstants, {useClass: ConfigurationConstants}), 
    provide(ViewConstants, {useClass: ViewConstatns}) 
]; 

これらのプロバイダをアプリケーションのトップレベルインジェクタにブートストラップして、必要に応じてそれらを利用できるようにすることができます。ここで

import {CONSTANTS_PROVIDERS} from './constants'; 

bootstrap(App, [CONSTANTS_PROVIDERS]) 
    .catch(err => console.error(err)); 

は実証するplunkです:http://plnkr.co/edit/RPjDxoIZ8wLY3DDIdhJF

編集2: Plunkerはすぐに戻っていると私は一例に

編集更新しました: Plunkrは今ので、私はできる死んでいるのそれを更新するのではなく、私のコメントで私はこれを試していませんでした(私はこれを試していませんが、うまくいくはずです):

public class SubConstants() { 
    private _someString:string = 'Some String'; 
    ... 
    get someString():string { 
    return this._someString; 
    } 
    ... 
} 

@Injectable() 
public class ConfigurationConstants() { 
    private _cookieName:string = 'etl_language'; 
    private _subConstants:SubConstants = new SubConstants(); 
    ... 
    get cookieName():string { 
    return this._cookieName; 
    } 

    get subConstants():SubConstants { 
    return this._subConstants; 
    } 
    ... 
} 

// ... this would allow you to then do: 
confConstants.subConstants.someString 
// assuming you injected ConfigurationConstants as confConstants 

もう一度これは内部クラスの提案より多くのコードなので、おそらくあなたが好むものです。

+0

"定数"クラスのほかに、同じパターンに従うべき "言語"クラスもあります。問題は、クラスに多くの内部クラスが含まれていることです。場合によっては、 "Language.Materials.Metal.Name"のようなキーを持つことができます。あなたのアプローチは面白いですが、クラスの構造によって**たくさん**のコードを書くことができます。あなたのアプローチを私のものと混在させることは面白くないでしょうか?クラスの「静的」をすべて削除しますが、クラスとしてエクスポートします。 – ssougnez

+0

私は「私はクラスから静的なものをすべて削除しますが、私は**あなたがしたようにクラスとして注入しますか? – ssougnez

+0

私はあなたが探しているネストされたキーを取得するために、個人的にはネストされた分類と構成を使わないでください。私は答えを例文で更新します – Zyzle

3

DIはオプションですが、オブジェクトのインスタンスを操作する場合に適しています。インポートは多くの場合OKですが、DIはインスタンスのインスタンス化からコードを切り離します。これは、自動テストを実行している場合や、コンポーネントに柔軟性を持たせ、特定のシグネチャを持つオブジェクトを受け入れる場合に便利です。

あなたが興味を持っている場合、私はここにDIについていくつかの詳細情報を持っている: http://www.syntaxsuccess.com/viewarticle/dependency-injection-in-angular-2.0

+0

これは、私が現在使っているものよりも、これを達成するためのより良い方法を探している理由です。 Zyzleの答えは良いスタートのようです。ありがとう – ssougnez

0

私のアドバイスは、それが価値あるものです。あなたが実際に問題を解決する必要がないかぎり、依存関係注入は使用しないでください。

いくつかの過度に要求の厳しいフレームワークを満たすために、アプリケーション全体でDIを使用する必要がない、または悪いことにシステムのDIを使用すると、わかりにくいコードになります。 (おそらく、どのデザインパターンにも当てはまります)。

角度の階層的なDIは、特に私にとっては大変なようです。アプリケーションが特定の依存関係を解決するのに十分な大きさになったら、そのインスタンスが共有されているものは何か、あなたのコードベース全体に浸透しています。

関連する問題