2010-08-04 104 views
10

创建我有一类像这样,我在我的代码的地方创建自己:吉斯进样场类不吉斯

class StarryEyes { 
    @Inject MyValidator validator; 

    public StarryEyes(String name) { 
     //.. 
    } 

    public doSomething() { 
     // validator is NULL 
    } 
} 

我想吉斯注入校验器的实例,其中有一个@Singleton注解。 我的影片在启动时加载的模块,它包含行:

bind(MyValidator.class); 

但是,它似乎并不为“验证”工作始终是零。我已经尝试了一些变化,如:

bind(MyValidator.class)toInstance(new MyValidator()); 

或其他类似的东西。这不是Guice应该如何工作?

回答

33

通常Guice需要创建对象来注入它们。如果你只是打电话给new StarryEyes(name),Guice永远不会看到那个物体,所以它不能注入它。你可以做的一件事就是在创建对象之后调用对象injector.injectMembers(obj)。尽管如此,我不会建议,因为您应该避免在代码中引用注入器。

你真的很想在这里得到的是Assisted Inject。借助辅助进样,你声明构造你的类是这样的:

@Inject public StarryEyes(MyValidator validator, @Assisted String name) 

它的意思是,validator是吉斯应该注入一个参数,而name必须是“辅助”(即,提供在创建实例时)。

然后,您可以创建这样一个接口:

public interface StarryEyesFactory { 
    StarryEyes create(String name); 
} 

借助辅助进样,吉斯可以然后实现工厂为您服务。你绑定这样的:

bind(StarryEyesFactory.class).toProvider(
    FactoryProvider.newFactory(StarryEyesFactory.class, StarryEyes.class)); 

你再注入一个StarryEyesFactory任何你想要创建它的一个实例。如果您以前拨打new StarryEyes(name),则现在请拨打starryEyesFactory.create(name)。当您在工厂上调用create(name)时,它将取名并将其传递给构造函数,并提供绑定的验证程序本身。

在吉斯3开始,你就这样用FactoryModuleBuilder

install(new FactoryModuleBuilder().build(StarryEyesFactory.class));