使用自定义参数注入变量而不创建2个guice helper接口?

我正在使用guice在我的构造函数中动态注入类。 例如:

@Inject public PublisherFrame(EventBus eventBus, MyPublisherService publishService) 

在我的guice模块中:

 bind(EventBus.class).in(Singleton.class); bind(MyPublisherService.class).in(Singleton.class); 

工作没有问题。

当我创建一个具有在java代码中构造的参数的对象时,问题就开始了:

 public LoginController(EventBus eventBus, MyPublisherService publisherService, LoginDialog dlg) 

这里的LoginDialog是java代码创建的java类。 为了解决这个问题,我使用了@assist和:

 install(new FactoryModuleBuilder().implement(ILoginController.class, LoginController.class).build(GuiceLoginControllerFactory.class)); 

工作也很好。 但现在我必须创建2个额外的java文件:

  • 一个新的LoginController接口:ILoginController,除了帮助guice之外什么也不做。
  • guice的另一个接口:GuiceLoginControllerFactory

有没有更简单的方法来注入一个在构造函数中有自定义参数的变量? (没有创建2个额外的“guice”帮助文件)

您实际上并不需要类本身的附加接口(参见下文)。 此外,我通常将我的工厂创建为它创建的类的嵌套接口:

 public class LoginController { public interface Factory { LoginController create(LoginDialog dlg); } @Inject public LoginController( EventBus eventBus, MyPublisherService publisherService, @Assisted LoginDialog dlg) { /* ... */ } } // in your module install(new FactoryModuleBuilder().build(LoginController.Factory.class)); 

您不需要调用FactoryModuleBuilder.implement除非您希望Factory的工厂方法的返回类型是接口而不是具体类 – 然后Guice将不知道在没有您的帮助的情况下构造什么样的具体类型。 在下面的示例中,您无法要求FactoryModuleBuilder为您简单地实现LoginService.Factory ,因为它不知道要实例化哪个具体的LoginService实现者:

 interface LoginService { interface Factory { LoginService create(NetConnection connection); } boolean login(String username, String password); } class SimpleLoginService implements LoginService { @Inject SimpleLoginService(@Assisted NetConnection connection) { /* ... */ } } class SecuredLoginService implements LoginService { @Inject SecuredLoginService( EncryptionService encryptionService, @Assisted NetConnection connection) { /* ... */ } } // in your module: implements LoginService.Factory install(new FactoryModuleBuilder() .implement(LoginService.class, SimpleLoginService.class) .build(LoginService.Factory.class)); // this one implements @Secured LoginService.Factory install(new FactoryModuleBuilder() .implement(LoginService.class, SecuredLoginService.class) .build(Key.get(LoginService.Factory.class, Secured.class)); 

除此之外, condit创建setter方法的想法并不坏,但这确实意味着你正在以部分初始化的状态构建你的类。