【问题标题】:How to propagate a value during injection with GIN如何在使用 GIN 注入期间传播值
【发布时间】:2013-09-30 17:09:32
【问题描述】:

我想用 GIN 在某处注入一个 A 类。 A 类构造函数需要一个在运行时知道的 id 以及另外两个 B 和 C 类。B 和 C 构造函数需要 A 的相同 id 作为参数。

这里是类的示例。

public class A {
   @Inject
   public A(String id, B b, C c)
   {
    ...
   }
}

public class B {
   @Inject
   public B(String id)
   {
    ...
   }
}

public class C {
   @Inject
   public C(String id)
   {
    ...
   }
}

如何在 A 注入期间将 id 传播到所有类?

一种解决方案是使用 AssistedInjectionFactory 和所有三个类的创建方法,但这需要修改 A 构造函数才能使用工厂实例化 B 和 C。

还有其他方法可以使用 GIN 并避免 A 构造函数样板代码吗?

【问题讨论】:

    标签: java gwt dependency-injection gwt-gin


    【解决方案1】:

    我会使用 @Named 注释,具体取决于您要如何计算 id 值、bindConstant 方法或 Provider

    ...
    @Inject public A(@Named("myId") String id, B b, C c)
    ...
    @Inject public B(@Named("myId") String id)
    ...
    @Inject public C(@Named("myId") String id)
    
    
    public class MyModule extends AbstractGinModule {
    
      protected void configure() {
        // You can use bindConstant and compute the id in configure()
        String myid = "foo_" + System.currentTimeMillis();
        bindConstant().annotatedWith(Names.named("myId")).to(myId)
      }
    
      // Or you can use a provider to compute your Id someway 
      @Provides @Named("myId") public String getMyId() {
        return "bar_" + System.currentTimeMillis();
      }      
    
    }
    

    【讨论】:

    • 如果我想用不同的 id 创建不同的 A 实例,这也有效?
    • 是的,之前要创建 A 的新实例,您必须以某种方式对Provider 说它必须提供的下一个 id 是什么。例如以静态方式,如MyModule.nextId = "whatever";
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2011-10-28
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多