2012-03-29 15 views
1

私は、次のファクトリクラスを持っている:私のために工場を作ることができますか?

public class MessagePresenterCreator implements IPresenterFactory{ 
    @Override 
    public MessagePresenter createPresenter(Message m) { 
     if (m instanceof Letter) { 
      return new LetterPresenter(); 
     } 
     if (m instanceof Cable) { 
      return new CablePresenter(); 
     } 
     if (m instanceof Postcard) { 
      return new PostcardPresenter(); 
     } 
     throw new IllegalArgumentException(); 
    } 
} 

は私が自動生成して、次のインタフェースによって供給、工場へのGuiceを設定することができます。

public interface IPresenterFactory { 
    public abstract MessagePresenter createPresenter(Message m); 
} 
+0

Guiceがメッセージをメッセージプレゼンターにするために必要なロジックを解明できるかどうか質問していますか?そうではありません。 –

+0

私はLetter-> LetterPresenter等をマッピングするguiceモジュールを構成できるかどうかを尋ねています。guiceは私の工場を作ります。 – oshai

答えて

1

ませGuiceのは、そのような工場を持っていません。あなたはMap<Class<? extends Message>, Class<? extends MessagePresenter>を取った工場を書くことができ、その反射を使用することができます。それがあなたの目標であれば、あなたはGuiceモジュールでそれを管理することができます。単にコンポーネントからオブジェクトを組み立て工場、およびそのアセンブリに条件ロジックを行う工場 -

public class MessagePresenterCreator implements IPresenterFactory{ 
    private final Map<Class<? extends Message>, Class<? extends MessagePresenter> mapping; 
    public MessagePresenterCreator(Map<Class<? extends Message>, Class<? extends MessagePresenter> mapping) { 
     this.mapping = mapping; 
    } 

    @Override 
    public MessagePresenter createPresenter(Message m) { 
     Class<? extends MessagePresenter> clazz = mapping.get(m); 
     if (clazz == null) { 
      throw new UnsupportedOperationException(); 
     } 
     return clazz.newInstance(); 
    } 
} 
4

私は2つの方法で工場を考えるのが好き。

工場には論理があります。 Guiceはそのロジックを自動化することはできません。なぜならそれは単に依存関係の配線を処理するだけだからです。注入された依存関係のある程度の量が必要な作成されたタイプと作成時に提供されるものがある場合、工場の自動配線はguiceのAssistedInject extensionで行うことができます。これは、ファクトリインターフェイスを提供し、作成された型のフィールドに@AssistedInjectを注釈し、guiceの拡張は、インジェクタにバインドされたものを注入し、それらのcreate()パラメータを渡すファクトリ実装クラスを作成します。しかし、そのような場合、GuiceとAssistedInjectが行っているのは、あらかじめ指定されたレシピに従って物を配線することです。それは最後の段階で彼らについての決定をしていない。

オブジェクトの条件付き作成を提供しています。それはうまくいかないでしょう。

An idea aboveはプレゼンターにタイプのマッピングに依存工場を作る言及 - のようなもの:あなたはMultibinderのMapBindingsとそれを組み合わせる場合

Map<Class<? extends Message>, Class<? extends MessagePresenter>> 

これは、良いアプローチです。

このアプローチでは、Message - > MessagePresenterサブクラスの初期マッピングを定義する拡張可能なファクトリを作成することができますが、後で変更することなく追加のマッピングを可能にしますあなたの工場 - ちょうどそうのように、multibinder上で複数のマッピングをバインド:

MapBinder<String, Snack> mapbinder = MapBinder.newMapBinder(
    binder(), 
    new TypeLiteral<Class<? extends Message>>(){}, 
    new TypeLiteral<Class<? extends MessagePresenter>>(){}); 
mapbinder.addBinding(MyMessage.class).toInstance(MyMessagePresenter.class); 
mapbinder.addBinding(YourMessage.class).toInstance(YourMessagePresenter.class); 

そして、あなたはマッピングを使用して切り替えるの間でより多くの種類を、追加して、あなたが好きなように多くのモジュールでこれを行うことができます。

+0

hmmm、私はMap >をバインドしてそれをしようとしていますが、それはまったく機能していません。http://stackoverflow.com/questions/14833777/guice-multibinder-with-providersそれを動作させるように見えることはできません。 –

関連する問題