4

WebアプリでGuiceを問題なく使用しましたが、デスクトップアプリで使用したいと思いました。私は確かに1つのことを見逃しています-すべてをバインドする方法をアプリに伝え、何が何であるかを知る方法です。Webアプリでは、Applicationクラスでその宣言がありましたが、デスクトップアプリでどのように行う必要がありますか?

これが私が使用している関連コードです:

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);に乗っています。

それで、それを機能させるために私は他に何をしなければなりませんか?

編集:

わかりました、その部分は今機能します、ありがとう:)永続性をそのように機能させるために、私はもう少しする必要があるようです。

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

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

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

install(new PersistenceManagerFilter.GuiceModule());のように見えます。十分ではありません。私は何をする必要がありますか?私のリポジトリクラスは次で始まります:

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; 
} 

私のPMFで私は持っています:

public static class GuiceModule extends AbstractModule { 

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

3 に答える 3

5

Bootstrapmainメソッドでクラスを作成します。

現在の静的メインメソッドコードを非静的コードに移動します。たとえば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クラスを実行します。

于 2012-01-16T17:09:16.197 に答える
3

Guiceインジェクターを使用して作成されたオブジェクトはすべて、そのプロパティとメソッドにオブジェクトを注入します。したがって、1つの方法は、createNewProjectでインジェクターを作成することです。

Injector injector = Guice.createInjector(new BeanModule(),.....
YourMainClass startClass = injector.getInstance(YourMainClass.class);
startClass.kickOfEveryThing();....
于 2012-01-16T16:43:32.073 に答える
1

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

http://code.google.com/p/google-guice/wiki/GettingStartedを参照してください

Injector injector = Guice.createInjector(new GuiceModule());
Main main = injector.getInstance(Main.class);
于 2012-01-16T16:41:20.250 に答える