2

我正在使用启用 Guice 的框架。

当使用由框架创建的类(或覆盖现有绑定的子类)时,我可以很容易地实例化框架提供的变量。无论我需要什么,这只是一个问题

@Inject
FrameworkProvidedType variable;

但是,在我自定义创建的类中,这不起作用。所有注入的变量都是空的。

我的理解是,为了使用注入,我的类必须有一个绑定。

如果我对现有框架类进行子类化,我可以覆盖我的模块类中的绑定。这很简单。

但是我有一个新类,我不知道如何将它绑定到底层框架。

public Class myCustomClass {

   private String iNeedthis;
   private Context thisToo;

   @Inject
   FrameWorkThing magic;

   public myCustomClass(String iNeedThis, Context thisToo){
         this.iNeedThis = iNeedThis;
         this.thisToo = thisToo;
   }

   public void DoMagic(){
        //null pointer error because magic was not injected
        magic.doMagic(this.iNeedthis);
   }
}

我如何 Guice 启用这个新类?

我在我的运行时模块中试过这个

public Class<myCustomClass> bindMyCustomClass(){
    return MyCustomClass.class;
}

并惨遭失败。

4

1 回答 1

1

不感谢@bmorris591,他驳回了这个问题,并在门外否决了这个问题,我找到了答案。

@Inject-ing 一个字段到一个类中意味着该类实例需要由 Guice 创建。

第 1 步是为该类创建一个工厂。这可能没有必要,但它对我有用。

public interface MyCustomClassFactory {
    public MyCustomClass create(String iNeedThis, Context thisToo);
}

第 2 步是将工厂安装到 Guice

@Override
public void configure(Binder binder) {

    super.configure(binder);

    binder.install(new FactoryModuleBuilder().build(MyCustomClass.class));
}

在我的特殊情况下 - 我正在使用的框架提供了一个 Module 类,它是 com.google.inject.Module 的实现。

该类中有一个在启动时调用的“配置(Binder binder)”函数。

第 3 步实际上是对构造函数进行注解

@Inject
public myCustomClass(String iNeedThis, Context thisToo){
     this.iNeedThis = iNeedThis;
     this.thisToo = thisToo;
}

使我走上正轨的有用且相关的网页:

http://beust.com/weblog/2012/08/21/advanced-dependency-injection-with-guice/

这谈到了辅助注射,但它提供了足够的信息和一个简单易懂的例子,说明下一步非常容易。

于 2013-04-11T02:23:52.583 回答