2011-03-28 110 views
0

我有這樣的事情:注入匿名內部類(GIN)

request.findAllProjects().fire(new ExtReceiver<List<ProjectProxy>>() { 

    @Override 
    public void onSuccess(List<ProjectProxy> response) { 
     view.setProjects(response);      
    } 
}); 

這是匿名內部類的抽象類ExtReceiver的。 ExtReceiver用於處理錯誤,我想提供一個errorHandler。

public abstract class ExtReceiver<T> extends Receiver<T> { 


    private ErrorHandler errorHandler; 


    public ExtReceiver() { 
    } 

    @Inject 
    public void setErrorHandler(ErrorHandler errorHandler) 
    { 
     this.errorHandler = errorHandler; 
    } 

    @Override 
    public abstract void onSuccess(T response); 

    @Override 
    public void onFailure(ServerFailure error) { 
     errorHandler.exception(error); 
    } 

    @Override 
    public void onViolation(Set<Violation> errors) { 
     ValidationUtils.processViolation(errors); 
    } 

} 

我明白爲什麼這不起作用,因爲我使用新的操作符。但我怎麼能這樣做。我想擁有這個匿名類,而不是將它放在自己的文件或其他東西中。 我怎麼注入那個errorHandler?想到靜態注入,但它看起來像這不工作(也許是因爲我創建一個匿名類繼承)

在正常的Guice相反,我不知道一個injector.getInstance()調用。

的信息:這是一個requestFactory呼叫

回答

1

你爲什麼不把的ErrorHandler參數到您的抽象類的構造函數而不是創建一個單獨的二傳手的setErrorHandler,像這樣:

public abstract class ExtReceiver<T> extends Receiver<T> { 

    private ErrorHandler errorHandler; 

    @Inject 
    public ExtReceiver(ErrorHandler errorHandler) { 
     this.errorHandler = errorHandler; 
    } 

} 

聲明綁定:

public class MyClientModule extends AbstractGinModule { 
    protected void configure() { 
    bind(ErrorHandler.class).in(Singleton.class); 
    } 
} 

聲明一個Ginjector您的ErrorHandler類模塊註釋吧:

@GinModules(MyClientModule.class) 
public interface MyErrorHandlerInjector extends Ginjector { 
    ErrorHandler getErrorHandler(); 
} 

,然後用它是這樣的:

MyErrorHandlerGinjector injector = GWT.create(MyErrorHandlerGinjector.class); 
ErrorHandler errorHandler = injector.getErrorHandler(); 
request.findAllProjects().fire(new ExtReceiver<List<ProjectProxy>>(errorHandler) {  

     @Override 
     public void onSuccess(List<ProjectProxy> response) { 
      view.setProjects(response); 

     }   
    }); 

我認爲這應該工作。

+0

我最終擴展了現有的Ginjector。我只有一個getApp() - 這是一個根。現在我有第二個getErrorHandler()調用。但我認爲這是唯一的解決方案。與你提出的解決方案不同的是,在ExtReceiver的靜態構造中創建注入器,而不是在調用類中創建注入器。所以我不必像你那樣手動注入errorHandler。 – ludwigm 2011-03-30 13:24:27