2012-01-16 4 views
4

WebアプリケーションでGuiceを問題なく使用しています。デスクトップアプリケーションで使用したかったのです。私は確かに一つのことを欠いている - 私のアプリにすべてを束縛する方法を教え、何が何であるかを知るための何らかの方法。 Webアプリケーションでは、Applicationクラスの宣言がありました。デスクトップアプリケーションではどうすればいいですか?Google Guiceデスクトップアプリケーション - どのように動作させるには?

public class GuiceModule extends AbstractModule 
{ 
    @Override 
    protected void configure() 
    { 
    // Enable per-request-thread PersistenceManager injection. 
    install(new PersistenceManagerFilter.GuiceModule()); 
    // Business object bindings go here. 
    bind(ProjectQueries.class).to(JdoProjectQueries.class); 
    bind(new TypeLiteral<Repository<Project>>() { }).to(JdoProjectRepository.class); 
} 

私のメインクラス:ここ

は、私が使用しています関連するコードです

@Inject 
public Repository<Project> projectRepo; 

public void createNewProject() { 
    ... 
    projectRepo.persist(newProject); 
} 

を私はもちろんprojectRepo.persist(newProject)に取得しています。

それで、それを機能させるには他に何が必要ですか?

EDIT:

[OK]を、その部分の仕事は今、感謝:)私が永続化がそのように動作させるためにかかわらず、もう少し行う必要があるようです。

私は今ここにNPEを取得しています:

public void persist(T entity) 
{ 
pmProvider.get().makePersistent(entity); 
} 

のget()はnullを返しますここ

はインストールのように見えます(新しいPersistenceManagerFilter.GuiceModule()); で十分ではありません。私は何をする必要がありますか?私が持っている私のPMFで

public abstract class JdoRepository<T> implements Repository<T> { 
    private final Class<T> clazz; 
    private final Provider<PersistenceManager> pmProvider; 
    protected JdoRepository(Class<T> clazz, Provider<PersistenceManager> pmProvider) {  this.clazz = clazz; this.pmProvider = pmProvider; 
} 

:私のリポジトリクラスで始まる

public static class GuiceModule extends AbstractModule { 

    @Override protected void configure() { 
    bind(PersistenceManager.class).toProvider(new Provider<PersistenceManager>() { 
     public PersistenceManager get() { 
     return PersistenceManagerFilter.pm.get(); 
     } 
     }); 
    } 
    } 

答えて

5

メインメソッドでBootstrapクラスを作成します。

現在の静的メインメソッドコードを非静的メソッドコードに移動します。たとえば、Application#runです。

Bootstrapクラスのmainメソッドを作成します。

public static void main(String[] args) { 
    Injector injector = Guice.createInjector(new GuiceModule()) 
    Application app = injector.getInstance(Application.class); 
    app.run(); 
} 

実行Bootstrapクラスを。

+0

これで問題は解決しました。私は少なくとももう一つ事を開始する必要があるように見えます。 ここでNPEを取得しています: public void persist(Tエンティティ) { pmProvider.get()。makePersistent(エンティティ); } – Paul

+0

install(新しいPersistenceManagerFilter.GuiceModule())のように見えます。 で十分ではありません。私は何をする必要がありますか? 私のリポジトリクラスで始まる: パブリック抽象クラスJdoRepository はリポジトリ { 民間最終クラス clazzを実装します。 プライベート最終プロバイダ pmProvider; protected JdoRepository(クラス clazz、プロバイダ pmProvider) { this.clazz = clazz; this.pmProvider = pmProvider; のpublic staticクラスGuiceModuleはAbstractModule { @Override 保護されたボイドのconfigure() { バインド(PersistenceManager.class).toProvider(新しいプロバイダ() { を拡張:私は私のPMFで } – Paul

+0

public PersistenceManager get() { return PersistenceManagerFilter.pm.get(); } }); } } – Paul

1

あなたは、少なくともインジェクタに1つのルートオブジェクトに依頼する必要があります。このルートオブジェクトにはオブジェクトが注入され、オブジェクトなどが注入されます。プロセスはブートストラップする必要があります。

http://code.google.com/p/google-guice/wiki/GettingStarted

Injector injector = Guice.createInjector(new GuiceModule()); 
Main main = injector.getInstance(Main.class); 
3

そのプロパティとメソッドにオブジェクトを注入するGuiceのインジェクタを使用して作成された任意のオブジェクトを参照してください。そこで、createNewProjectにインジェクタを作成する方法があります。

Injector injector = Guice.createInjector(new BeanModule(),..... 
YourMainClass startClass = injector.getInstance(YourMainClass.class); 
startClass.kickOfEveryThing();.... 
関連する問題