2012-01-16 24 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)的;

那麼,我還需要做些什麼才能使它工作?

編輯:

好了,現在這部分的工作,謝謝:)看來我需要做的多一點,雖然使持續工作的方式。

我在這裏得到NPE現在:

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

的get()返回null這裏

它看起來像 安裝(新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(); 
     } 
     }); 
    } 
    } 

回答

5

創建Bootstrap類與主要方法。

將您當前的靜態主要方法代碼移至非靜態主方法代碼。例如Application#run

Bootstrap類創建主要方法:

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 entity) {pmProvider.get()。makePersistent這個(實體); } – Paul

+0

它看起來像 安裝(新的PersistenceManagerFilter.GuiceModule()); 是不夠的。我需要做什麼? 我的倉庫類開始: 公共抽象類JdoRepository 實現庫 { 私人最終級 clazz中; private final Provider pmProvider; protected JdoRepository(Class clazz,Provider pmProvider) { this.clazz = clazz; this.pmProvider = pmProvider; } – Paul

+0

在我PMF我: 公共靜態類GuiceModule擴展AbstractModule { @覆蓋 保護無效配置(){ 綁定 (PersistenceManager.class).toProvider(新供應商(){ public PersistenceManager get() { return PersistenceManagerFilter.pm.get(); } }); } } – Paul

1

你需要一個根對象至少問的注射器。這個根對象將被注入對象,這些對象將被注入對象等等。該過程需要引導。

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

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

正在使用一個噴射器吉斯將注入物體插入其屬性和方法創建的任何對象。所以有一種方法是在createNewProject中創建一個注入器。

Injector injector = Guice.createInjector(new BeanModule(),..... 
YourMainClass startClass = injector.getInstance(YourMainClass.class); 
startClass.kickOfEveryThing();....