2013-04-22 21 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(); 
    } 
} 

这不是一个好的方法,因为它会将运行时应该是编译时错误,但是在我们试图决定如何处理默认绑定时,作为一个阻挡点,我认为这是可行的。