向我的ClientModule传递一个构造函数参数



在我的GWT项目中有一个非常简单的GIN用法。我按照Guice教程进行了设置。

我想绑定一个不变的长变量到我的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()方法?

传递值给GIN的唯一方法是使用共享状态,即一些static变量/方法,您可以在一侧设置并从您的GinModule访问/调用

如果在编译时不知道变量的值,那么从技术上讲,它不是常量。另外,如果内存不足,模块类是在编译时使用的,而不是在运行时使用的,所以这种方法不太管用。

当你有值的时候,你能初始化你的变量吗?

您可以遵循的另一种方法是:

@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.
  }
}

这里有两个键:

  • MyConstants类上的@Singleton注释(否则GIN将创建一个新实例(always)。
  • AppMain,你需要这样做,否则注入@Inject MyConstants将为空(如果您尝试直接在EntryPoint中访问它)。

相关内容

  • 没有找到相关文章

最新更新