4

如果我创建一个提供程序并将其绑定到一个类,就像这样

bind(MyClass.class).toProvider(MyClassProvider.class)

然后Provider<MyClass>自动被绑定to MyClassProvider。如果您想将 aProvider<MyClass>注入MyClassProvider,那将是一个问题,如下所示:

@Inject
public MyClassProvider(Provider<MyClass> provider)

我想将默认的 Guice 提供程序注入到我的提供程序中,以便我可以轻松地在我的自定义提供程序中创建新实例。怎么做?

4

1 回答 1

4

您将需要在两者之一上使用绑定注释。如果您不介意 MyClass 的用户被注释,这很容易。

public class AccountTest {

   @Test
   public void test() {
       Injector injector = Guice.createInjector(new AbstractModule() {

           @Override
           protected void configure() {
               bind(MyClass.class).annotatedWith(Names.named("MYPROVIDER")).toProvider(MyClassProvider.class);
           }
       });
       MyClassUser user = injector.getInstance(MyClassUser.class);

       assertTrue(user.get().myProvider); // Shows if was created via my provider or the Guice provider.
   }
}

class MyClassUser {
    Provider<MyClass> provider;

    @com.google.inject.Inject
    public MyClassUser(@Named("MYPROVIDER") Provider<MyClass> provider) {
        this.provider=  provider;
    }

    MyClass get() {
        return provider.get();
    }
}

class MyClass {
    boolean myProvider = false;
}

class MyClassProvider implements Provider<MyClass> {
    Provider<MyClass> provider;

    @com.google.inject.Inject
    public MyClassProvider(Provider<MyClass> provider) {
        this.provider=  provider;
    }

    @Override
    public MyClass get() {
        MyClass c = provider.get();
        c.myProvider = true;
        return c;
    }

    public String toString() {
        return "Our provider";
    }
}

如果您不希望 MyClass 的用户使用命名提供程序,我能够使其工作的唯一方法是扩展MyClassMyClassProvider需要一个“ MyClass2”提供程序。作为一种解决方案,它闻起来很有效(而不是用糟糕的答案污染这个答案,你可以在这个 gist上找到代码)。

您可以使用私有模块或子模块来做到这一点(因为它是机器人腿问题的变体),但我一直无法弄清楚如何做到这一点。

于 2013-03-21T16:25:42.407 回答