GIN - 将构造函数参数传递给我的ClientModule

时间:2014-05-30 11:34:58

标签: gwt guice gin

我的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()方法中?

3 个答案:

答案 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的电话。