gpt4 book ai didi

java - 使用Guice : No implementation bounded

转载 作者:行者123 更新时间:2023-12-01 23:00:04 25 4
gpt4 key购买 nike

我是 Guice 新手。我将 Guice 与 AWS SWF 结合使用。我当前的结构如下:

主类:

 class MainClass {

public static void main(String[] args) {
Injector injector = Guice.createInjector(new ClientModule(param1, param2));
injector = injector.createChildInjector(injector.getInstance(TestModule.class));
}
}

测试模块:

 class TestModule extends AbstractModule {

@override
protected void configure() {
// create SWF service object
// Register Workflow worker and Activity worker

TempWorkflowClientExternalFactory fac = TempClientExternalFactoryImpl(swf_service, domain);
bind(TempWorkflowClientExternalFactory.class).annotatedWith(Names.named("ABC")).toInstance(fac);
}
}

定义到我想使用它的类:

 class Test {

@Inject
@Named("ABC")
TempWorkflowClientExternalFactoryImpl fac;


public void method() {

TempWorkflowClientExternal temp = fac.getClient("123");
temp.callWorkflowMethod() // This method is defined in SWF Workflow Activity class
}
}

但是在执行时我收到以下错误:

No implementation for <packageName>.TempWorkflowClientExternalFactoryImpl annotated with @com.google.inject.name.Named(value=ABC) was bound

无论注入(inject) TempWorkflowClientExternalFactory,我都需要返回相同的对象。我尝试查找 Guice wiki/FAQ。不幸的是,我认为我忽略了一些东西或误解了一些概念。

如果我不使用绑定(bind),而是在 configure 中使用以下代码创建fac后的方法对象,我的应用程序按预期工作。

 TempWorkflowClientExternal temp = fac.getClient("123");
temp.callWorkflowMethod()

但是当我尝试绑定(bind)时,它失败了。

更新:如果我在没有 annotatedWith 的情况下执行绑定(bind),程序执行,但我可以观察到绑定(bind)未正确完成,如 fac Test 中的对象类使用默认构造函数实例化,而不是我想要关联的对象

其他详细信息:TempWorkflowClientExternalFactoryImpl、TempWorkflowClientExternalFactory、TempWorkflowClientExternal 也是 AWS-SWF 自动生成的类。我无法修改它们的构造函数或在这些类中添加任何注释。当满足某些业务逻辑条件时,将调用 Test.method()。

有人可以帮助解决该错误吗?

最佳答案

bind(TempClientExternalFactory.class).annotatedWith(Names.named("ABC"))
.toInstance(fac);

此时,Guice 知道了一把 key :@Named("ABC") TempClientExternalFactory 。未绑定(bind) Impl。

@Inject
@Named("ABC")
TempClientExternalFactoryImpl fac;

但是,在这里,您不需要请求 Factory ,您请求 FactoryImpl 。 Guice 不知道如何提供它,所以它告诉你:

No implementation for <packageName>.TempWorkflowClientExternalFactoryImpl annotated with @com.google.inject.name.Named(value=ABC) was bound.

<小时/>

据我所知,你有 3 个选择:

  1. 请求 Factory,而不是 FactoryImpl。这是最好的简单解决方案,因为它可以帮助您实现接口(interface)编码的 Guice/OOP 最佳实践,而不是实现。您可以将测试中的工厂替换为任何实现,包括来自模拟框架的实现。

    @Inject
    @Named("ABC")
    TempClientExternalFactory fac;
  2. 绑定(bind) @Named("ABC") FactoryImpl到实例,然后绑定(bind)@Named("ABC") Factory@Named("ABC") FactoryImpl 。这是一个很好的解决方案,以防万一您希望您的类区分请求接口(interface)和请求实现,即使它们现在解析为同一个类。否则,可能会导致代码困惑或不一致,因为接口(interface)和 impl 都可以通过图形获得。

    bind(TempClientExternalFactoryImpl.class).annotatedWith(Names.named("ABC"))
    .toInstance(fac);
    bind(TempClientExternalFactory.class).annotatedWith(Names.named("ABC"))
    .to(Key.get(TempClientExternalFactoryImpl.class, Names.named("ABC"));
  3. 如果您需要提供的真正依赖项是 TempWorkflowClientExternal 并且工厂接口(interface)/impl 不太可能更改或直接调用,请抽象出工厂。依赖注入(inject)和工厂模式可能有重叠的职责,因此您可以使用 Guice 返回正确的实现,而不是使用 Guice 返回工厂。

    这并不是说 Guice 不应该归还工厂;如果你的参数 "123"很可能会发生变化,那么让吉斯归还工厂是完全正确的。不过,如果该参数在您的代码库中是通用的,您可以将其抽象到您的 Guice Provider 中。

    bind(TempWorkflowClientExternal.class).toProvider(
    new Provider<TempWorkflowClientExternal>() {
    TempClientExternalFactory fac = new TempClientExternalFactoryImpl(null, null);
    return fac.getClient("123");
    });

    ...或者...

    @Provides TempWorkflowClientExternal getExternalFactory() {
    TempClientExternalFactory fac = new TempClientExternalFactoryImpl(null, null);
    return fac.getClient("123");
    }

关于java - 使用Guice : No implementation bounded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38363165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com