2013-04-22 57 views
3

如果我有一個類的默認impl,它確實定義@Inject構造函數,那很好。系統把它拿起來。我可以重寫匕首中的綁定嗎?

如果一個應用程序要替換一個子類,它默認實現了一套,我可以定義它的模塊中的@Provides和所謂的「新」在我自己的代碼,子類和匕首使用該IMPL而不是(從我可以說到目前爲止,這工作)。

但是,如果我想匕首來實例化的子類,它有沒有辦法做到這一點,而不在@Module宣佈「覆蓋=真」?我喜歡沒有override = true,這樣在構建時所有重複的檢查都會給我適當的警告。

一種方式做到這一點,當然,它迫使所有的應用程序直接申報@Provides。這隻會增加膨脹。

我用GIN(吉斯爲GWT)之前,你可以定義一個綁定到你想通過一個.class引用的類,但我沒有看到在匕首類似的事情。

回答

3

現在,有沒有辦法有一個「默認綁定」,你可以自由地覆蓋,而不使用「覆蓋」屬性(其目的更多的測試莫過於此。)我們正在考慮如何做默認綁定。

你可能會考慮使用一組綁定要做到這一點,通過具有類似沿着這些線路:

@Module(...) 
class MyModule { 
    @Qualifier @interface OverridableFoo { } 

    @Provides(type=SET_VALUES) @OverridableFoo Set<Foo> provideOverriddenFoo() { 
    return new HashSet<Foo>(); // Empty set to ensure the Set is initialized. 
    } 

    @Provides Foo provideFoo(@OverridableFoo Set<Foo> Foo overriddenFoo) { 
    switch (overriddenFoo.size()) { 
     case 0: return new DefaultFooImpl(); 
     case 1: return overriddenFoo.iterator().next(); 
     default: throw new IllegalStateException("More than one overridden Foo Provided."); 
    } 
    } 
} 

然後,當你想覆蓋,只需簡單的:

@Module(...) 
class MyModule { 
    @Provides(type=SET_VALUE) @OverridableFoo Foo provideBetterFoo() { 
    return new MyAwesomeFoo(); 
    } 
} 

這不是一個好的方法,因爲它會將運行時應該是編譯時錯誤,但是在我們試圖決定如何處理默認綁定時,作爲一個阻擋點,我認爲這是可行的。