我的GWT项目中有一个非常简单的GIN用法。我按照Guice教程进行设置。
我想将一个不变的Long变量绑定到我的AbstractGinModule子类中的注释。问题是我现在知道变量的值直到运行时(onModuleLoad)。在创建Ginjector之前我有价值......我只是不知道如何将它放入我的客户端模块中。
我已经看到答案说我可以将构造函数参数传递给我的ClientModule ......但是我没有看到它构造的位置。这只是注释布线。
@GinModules(MyClientModule.class)
public interface MyGinjector extends Ginjector {
}
public class MyClientModule extends AbstractGinModule {
@Override
protected void configure() {
bindConstant().annotatedWith(named("MyConstant")).to(???);
}
public class MyEntryPoint implements EntryPoint {
@Override
public void onModuleLoad() {
long myValue = 123456L;
MyGinjector injector = GWT.create(MyGinjector.class);
}
那么我怎样才能将我的值123456L输入到MyClientModule的configure()方法中?
答案 0 :(得分:1)
如果在编译时不知道变量的值,那么从技术上讲它不是常量。此外,如果内存服务,模块类在编译时使用,而不是在运行时使用,因此这种方法不会很有效。
您是否可以在获得值时初始化变量?
答案 1 :(得分:1)
您可以遵循的另一种方法是:
@Singleton
public class MyConstants {
private long myLong = null;
public void setLong(long yourLong) {
this.myLong = yourLong;
}
public long getLong() {
return myLong;
}
}
然后在你的EntryPoint获得课程:
public class MyEntryPoint implements EntryPoint {
@Override
public void onModuleLoad() {
MyGinjector.INSTANCE.getApplication().execute();
}
}
-
public interface AppInjectorGin extends Ginjector {
@GinModules(MyClientModule.class)
public interface MyGinjector extends AppInjectorGin{
MyGinjector INSTANCE = GWT.create(MyGinjector.class);
AppMain getApplication();
}
//Space for more Injectors if you need them :)
}
-
public class AppMain {
@Inject MyConstants myConstants;
public void execute() {
long theLong = 12345L;
myConstants.setLong(theLong);
//And now in every single place of your app, if you do
//@Inject MyConstants you will have there the value of the long.
}
}
这里有两个关键:
@Singleton
上的注释MyConstants
(否则
GIN
将始终创建一个新实例)。 AppMain
,你
需要这样做否则注射@Inject MyConstants
将为null(如果您尝试直接在EntryPoint
中访问它)。答案 2 :(得分:1)
将传递值传递给GIN的唯一方法是使用共享状态,即您可以在一侧设置并访问的某些static
变量/方法/来自GinModule
的电话。