我使用guice在构造函数中动态注入类。例如:
@Inject
public PublisherFrame(EventBus eventBus, MyPublisherService publishService)
在我的指导模块中:
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));
工作也很好。但是现在我必须创建两个额外的java文件:
有没有更简单的方法来注入一个在构造函数中有自定义参数的变量?(无需创建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));
您不需要调用<code>FactoryModuleBuilder。实现,除非您希望Factory的工厂方法的返回类型是一个接口而不是一个具体的类,否则如果没有您的帮助,Guice将不知道要构造什么样的具体类型。在下面的示例中,您不能要求FactoryModuleBuilder简单地实现<code>LoginService。工厂,因为它不知道要实例化哪个具体的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 方法的想法还不错,尽管这确实意味着您正在部分初始化状态下构造您的类。
目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?
我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con
我已经遵循了在PHP Laravel 5中创建自定义助手函数的最佳实践是什么? 这个问题的两个答案帮助我在laravel 5.1中创建自定义静态类。因为它是一个静态类。提前谢谢你。
看来Guice正在尝试使用不同于预期的创建方法。你知道怎么解决这个问题吗?如有任何指示,将不胜感激! 谢谢!
我有这个接口和简单的实现: 我想使用Guice用不同的方法生成一个。
假设有一个类A,它的构造函数是这样的: 还有AFactory: 所以要创建一个A的实例,我显然需要做这样的事情: 但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor): 我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。 正确的做法是什么?我就是想不出一个干净的方法来做到这一点。