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

Guice用逻辑辅助注入工厂

宁侯林
2023-03-14

我一直在用guice做一个项目。

我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。

演示代码

@Singleton
public class MyFactory {

    private final Foo foo;

    @Inject
    public MyFactory(final Foo foo) {
        this.foo = foo;
    }

    public A create(final Bar bar) {
        switch (bar) {
            case 0:
                return new B(foo, bar);
            case 1:
                return new C(foo, bar);
            //this goes on
        }
    }
}

public abstract A {
    public A(final Bar bar) {
        //do sth
    }
}

public B extends A {
    private final Foo foo;

    public B(final Foo foo, final Bar bar) {
        super(bar);
        this.foo = foo;
    }
}

public C extends A {
    private final Foo foo;

    public C(final Foo foo, final Bar bar) {
        super(bar);
        this.foo = foo;
    }
}

我想知道的是,如果我可以用Guice替换工厂,直接注入A的实现(请注意,它们应该使用辅助注入)?

谢谢你。

共有1个答案

吉泰宁
2023-03-14

您仍然需要My被害人根据您的id选择实现,尽管您的辅助注入可能非常短。

// No need for this to be @Singleton;
// if you want the same shared Foo instance, make it @Singleton
public class MyFactory {

    private final B.Factory bFactory;
    private final C.Factory cFactory;

    @Inject
    public MyFactory(B.Factory bFactory, C.Factory cFactory) {
        this.bFactory = bFactory;
        this.cFactory = cFactory;
    }

    public A create(final Bar bar) {
        switch (bar.getSomeInteger()) {   // I assume you're checking a
                                          // property of bar
            case 0:
                return bFactory.create(bar);
            case 1:
                return cFactory.create(bar);
            //this goes on
        }
    }
}

public B extends A {
    public interface Factory {
        B create(Bar bar);
    }

    private final Foo foo;

    public B(final Foo foo, @Assisted final Bar bar) {
        super(bar);
        this.foo = foo;
    }
}

public C extends A {
    public interface Factory {
        C create(Bar bar);
    }

    private final Foo foo;

    public C(final Foo foo, @Assisted final Bar bar) {
        super(bar);
        this.foo = foo;
    }
}

以及您的模块:

public class YourModule extends AbstractModule {
  @Override public void configure() {
    install(new FactoryModuleBuilder().build(B.Factory.class));
    install(new FactoryModuleBuilder().build(C.Factory.class));
  }
}

编辑:在我的示例中,您不需要调用FactoryModuleBuilder上的< code>implement,因为< code>B.Factory有一个返回子类B的< code>create方法。那么您将需要< code>implement调用,因为Guice不知道要调用哪个构造函数。

如果您想强制消费者对实现进行编码,您可能需要引用只返回接口的工厂。这通常是一个隐藏实现细节的好主意,可能需要创建<code>a。工厂使用方法A创建(条形码)并将其与实现>连接。然而,这在这里是不必要的,因为您的MyFactory已经返回了A并隐藏了实现子类(与<code>A.Factory</code>的逻辑类似),并且您需要<code>@Named</code>或其他限定符注释来区分这两个<code>A。您正在创建的工厂绑定。简言之,这是额外的复杂性,对这个特定的案例没有好处。

 类似资料:
  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

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

  • 我是一名guice新手,试图弄清楚如何使用FactoryModuleBuilder在guice中实现辅助注入。我参考了guice java文档来实现FactoryModuleBuilder。 我所做的一切都完全按照文件中所说的那样。这不是注射工厂。我提到了这个堆栈溢出问题:Guice AssistedInject不会注入具有相同问题的工厂。它讨论了构造函数注入之前的字段注入问题。我遵循了它,并尝试

  • 目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?

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

  • 我正在尝试在Guice进行辅助注射。 这是我的实现。 工厂界面。 吉思模块: 我得到错误:“DaoFactory不能用作键;这一点没有充分说明”。 我应该如何配置FactoryModuleBuilder? 我的目标是在运行时使用DaoFactory获取Dao的类型化实例