2011-12-13 18 views
33

私はこのクラスを持っている:DoorWindowRoofは具象クラスであるGuice Beginner - 具体的なクラスをバインドする方法は?

public class House { 
    private final Door door; 
    private final Window window; 
    private final Roof roof; 

    @Inject 
    public House(Door door, Window window, Roof roof) { 
     this.door = door; 
     this.window = window; 
     this.roof = roof; 
    } 
} 

。今、私はこのシナリオのためのモジュールを実装する場合、私はこのようにそれを行うだろう:

public class HouseModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(Door.class).to(Door.class); 
     bind(Window.class).to(Window.class); 
     bind(Roof.class).to(Roof.class); 
    } 
} 

しかし、これは具体的なクラスをバインドするための正しい方法であるのだろうか、あるいは簡単な方法があるかどうか。私はこれに簡単な方法があると感じています。

EDIT

はこれを試してみて、動作していないよう:

1) Binding points to itself. 
    at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.java:10) 

EDIT 2

何の結合が全く必要ありませんように思え:

Injector injector = Guice.createInjector(); 
House house = injector.getInstance(House.class); 

また、動作するようです。

答えて

22

のGuiceのJust-In-Time bindingは正確に何をしたいん。

いずれか公共、無引数のコンストラクタ、または@Inject注釈付きコンストラクタ

空のモジュール:(Guiceのdocumentationより引用)あなたのDoorWindowRoof満たす以下の要件を考えます

public class HouseModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    } 
} 
+0

空モジュールはどこに行きますか? Guiceはそれらを関連付ける方法をどのように知っていますか? – djechlin

+0

@djechlinこれは、アプリケーションの設定方法によって異なります。例えば、[Play](https://www.lightbend.com/play-framework)ベースのアプリケーションは、そのようなモジュールファイルがルートパッケージに含まれると期待しています。あるいは、アプリケーションの 'play.modules.enabled'を介して設定可能です.conf – Siddhartha

40

これは移動するための方法である:

protected void configure() { 
    bind(Door.class); 
    bind(Window.class); 
    bind(Roof.class); 
} 

Guiceのが言うように、彼らは、具象クラスなので、あなたは、それをBinderドキュメントをチェックアウト

:-)自分自身にバインドすることはできませんノート:

bind(ServiceImpl.class); 

この文は、本質的に何もしません。それは "ServiceImplクラスをそれ自身にバインド"し、Guiceのデフォルト動作を変更しません。 Moduleクラスが提供するサービスの明示的なマニフェストとして機能することを望む場合は、これを使用することができます。まれに、Guiceは、明示的に指定されていない限り、インジェクタ作成時にバインディングを検証できない場合があります。

@Injectとマークされたコンストラクタを持つ具体的なクラスは、自動的に注入することができます。しかし、開発者(あなた)は、モジュールで何が設定されているかを知るのに役立ちます。

+0

"モジュールで自動的に利用可能"とは、プロジェクト内のすべてのモジュールを意味しますか?あるいは、パッケージローカルモジュールを認識しているのですか、モジュール名などに基づいて一致していますか? – djechlin

+0

Door、Window、Roofは具象クラスなので、バインディングの方法を指定する必要はありません。これらはすべてのモジュールで使用できます。特定のインタフェースの実装が異なる場合は、Guiceを支援する必要があります。 – Jalayn

+0

インターフェイスをクラスにバインドする必要がない場合は、モジュールは必要ありません。 – Noya

6

InterfaceとImplementationクラスをリンクするにはバインディングが必要です(たとえば、test envの他の実装に変更する場合)。あなたは具象クラス、にを結合するための必要はありませんを持っているのでしかし、ただのクラスをバインドする

関連する問題