当前位置: 首页 > 知识库问答 >
问题:

Guice辅助注入多个接口实现

司徒嘉祥
2023-03-14
public static PrivateModule getAFactoryModule(final String factoryBindingKey,final Class<? extends A> targetClassToCreate) {
    return new PrivateModule() {

        @Override
        public void configure() {
            install(new FactoryModuleBuilder().implement(
                    A.class, targetClassToCreate).build(
                    AFactory.class));

            bind(AFactory.class).annotatedWith(Names.named(factoryBindingKey)).to(
                    Key.get(AFactory.class));
            expose(Key.get(AFactory.class, Names.named(factoryBindingKey)));
        }
    };
}
install(getAFactoryModule("B", B.class));
install(getAFactoryModule("C", C.class));
install(getAFactoryModule("D", D.class));
com.guice.test.B has @AssistedInject constructors but none of them match the parameters in method com.guice.test.AFactory.createD(). Unable to create assisted inject

com.guice.test.C has @AssistedInject constructors but none of them match the parameters in method com.guice.test.AFactory.createD(). Unable to create assisted inject

com.guice.test.D has @AssistedInject constructors but none of them match the parameters in method com.guice.test.AFactory.create(). Unable to create assisted inject

看来Guice正在尝试使用不同于预期的创建方法。你知道怎么解决这个问题吗?如有任何指示,将不胜感激!

谢谢!

共有1个答案

司寇羽
2023-03-14

这听起来像是您在做一些不安全的事情--让您的一些工厂方法未解析--而Guice也很困惑。基本上,FactoryModuleBuilder正在生成以下代码

@Named("B") public class GeneratedBClass implements AFactory {
  A create(int b, int c) { return new B(...); }
  A create(int d) { /* no implementation! */ }
}
@Named("C") public class GeneratedBClass implements AFactory {
  A create(int b, int c) { return new C(...); }
  A create(int d) { /* no implementation! */ }
}
@Named("D") public class GeneratedBClass implements AFactory {
  A create(int b, int c) { /* no implementation! */ }
  A create(int d) { return new D(...); }
}

这三个缺失的实现是Guice抱怨的原因:Guice找不到一个好的实现,并且你想要把它们连线起来。但是,除了Guice之外,您还设计了一个非常危险的API:根据您的配置,您的方法中的一个可以工作,而另一个不能工作--这比DI的设计更危险。

我要么将您的配置切换为仅切换“B”和“C”,并让这两个选项都显示一个“D”:

public interface AFactory {
  @Named("BorC") A create(int B, int C);
  @Named("D") A create(int D);
}

install(new FactoryModuleBuilder()
    .implement(A.class, Names.named("BorC"), targetClassToCreate)
    .implement(D.class, Names.named("D"), D.class)
    .build(AFactory.class));
public interface DFactory {
  D create(int D);
}

// If DFactory creates an A, you need implement(). Otherwise, this works.
install(new FactoryModuleBuilder().build(DFactory.class));
 类似资料:
  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

  • 我有一个工厂是这样的: 这样的类: 如何正确使用Google Guice来做同样的事情?我尝试了辅助注射,但我不确定如何创建“UrlBuilder”。谁能帮忙?

  • 我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。

  • 我已经使用google-guice和辅助注射机制有一段时间了。因为我在scala,刚刚发现scala-guice,我也对使用它感兴趣。但是我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。 因此,我的问题是:是否可以使用scala guice辅助注射,如果可以,请提供一个简单的例子? 此外,对于google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar

  • 我正在尝试结合Guice的这3个功能:注入,多重绑定,泛型。我创建了一个生产项目的原型,所以这里是: 首先,这是泛型的一个小层次结构(在生产案例中,有N个实体的层次结构): 接下来,类ToCreate1和ToCreate2我想创建的工厂。 基类: 它的继承者: 然后,工厂本身: 所以,现在我想注入一个map,包含< i>Factory 因此,我使用配置方法创建了Guice的抽象模块: 所以,我注入

  • 我有这个接口和简单的实现: 我想使用Guice用不同的方法生成一个。