2011-09-16 13 views
4

背景:私はGoogle Guiceを使用しているので、設定クラスを通過するのが簡単ですが、これは最善の方法ではないと思います。設定クラス - Guiceのベストプラクティス

私はいくつかのパスを格納した構成のクラスを持っている:

class Configuration{ 
    String getHomePath(); 
    String getUserPath(); 
} 

はまた、私は「USERPATHを」必要「HOMEPATH」とクラス「b」を必要とする「」クラスを持っています。

構成クラスをクラスaとクラスbのコンストラクタで渡すか、特定のパスを渡すだけですか?

答えて

1

ご質問には1つの回答はありません。お客様の状況に応じて、選択できるオプションはあります。

あなたのConfigurationクラスは、それはあなたのABのクラスの可能性があります場合を育てるために起こっている知っている場合は、そのコンストラクタに全体Configurationオブジェクトを渡し、そこからより多く使用されます。 NB:あなたは自分にABクラスの依存を減らすように、私は、これはYAGNIの原則に反している知っているが、時にはあなたがつもりだ知っているかもしれない、それは

;-)を必要とそうでない場合、あなたはあなたのパスの@Named注入の使用を検討することができます最低限、これは良いデザインの習慣です。

1

一般的なルールは、依存関係グラフ(クラスが他のクラス/インタフェースについて知っているか、または他のクラス/インタフェースに依存しているかどうか)をできるだけ単純、規則的および固定にするためのコードです。

Configurationクラスを渡さないと、aまたはbがユーザー作成のクラスに依存しないか、または依存関係ループを回避する必要がある場合は、個々のパス文字列を使用します。それ以外の場合は、「このクラスは設定情報にアクセスできますが、将来変更される可能性があります」と言うのが理にかなっている場合は、そのクラスを渡してください。

私はシングルトンアプローチを避けたいと思います。特にGuiceを既に設定している場合は特にそうです。

3

実際にGuiceを正しく使用している場合は、このようなすべての設定がモジュールのconfigureメソッドに表示されます。したがって:

  1. 構成クラスを削除します。
  2. おそらくHomePathUserPathと呼ばれる注釈クラスを作成します。
  3. ここで、クラスaはgetHomePath()を使用し、これをhomePathという名前のStringフィールドメンバーに置き換えます。
  4. ここで、クラスbはgetUserPath()を使用し、これをuserPathというStringフィールドメンバーに置き換えます。
  5. に注釈が付けられている(すでに存在するはずである)ように、それぞれ@HomePath@UserPathと注釈された文字列パラメータを取り込み、その値を挿入したStringフィールドメンバを割り当てます。
  6. モジュールのconfigureメソッドでバインディングを作成するには、正しい値を定義する.annotatedWith()を使用します。実行時にしか利用できない場合は、プロバイダをバインドします。

E.G.

class a { 
    private String homePath; 
    @Inject 
    public a(@HomePath String homePath) { 
    this.homePath = homePath; 
    } 
    public String tellMeAboutHome() { 
    return "We live in a nice home called " + homePath; 
    } 
} 

class customModule extends AbstractModule { 
    public static final String userPath = "/home/rafael"; 

    public void configure() { 
    bind(String.class).annotatedWith(HomePath.class).to("/home/"); 
    bind(String.class).annotatedWith(UserPath.class).to(userPath); 
    } 
} 

注釈を作成する場合は、@Named注釈Guiceのships withを使用し、あなたのためにあまりにも多くの仕事です。

関連する問題