Java 注:辅助注射厂
没有,我有以下几点Java 注:辅助注射厂,java,guice,assisted-inject,Java,Guice,Assisted Inject,没有,我有以下几点 interface IA { ... } class B implements IA { B (String p) } class C implements IA { C (String p) } interface IAFactory { IA create(String p) } class BFactory implements IAFactory { ... } class CFactory implements IAFact
interface IA { ... }
class B implements IA {
B (String p)
}
class C implements IA {
C (String p)
}
interface IAFactory {
IA create(String p)
}
class BFactory implements IAFactory { ... }
class CFactory implements IAFactory { ... }
但要使用辅助注射,我需要
class UberFactory {
B createB(@Assisted("stringB") String p)
C createC(@Assisted("stringC") String p)
}
以及B
和C
中相应的变化
这有两个问题:
createB
还是createC
UberFactory
贯穿我的包结构,以实例化IA
install(new FactoryModuleBuilder()
.implement(IA.class, B.class)
.annotatedWith(BFactoryQualifier.class)
.build(IAFactory.class));
install(new FactoryModuleBuilder()
.implement(IA.class, C.class)
.annotatedWith(CFactoryQualifier.class)
.build(IAFactory.class));
这样我就可以简单地注释我注入到应用程序代码中的IAFactory
实例
但据我所知,没有这样的API。所以
在我看来,能够注释您注入的工厂实例没有任何好处。这与您的问题相同#1-应用程序代码需要知道要注入哪个实例。它只是根据注释对其进行配置,但这实际上与调用
createB
vscreateC
相同。或者知道注射/使用BFactory
vsCFactory
。这与#2。。。了解您需要的类型是一个需要在某个地方处理的跨领域问题。是的,但使用注释来做到这一点是否与Guice的语法更一致?虽然注释与Guice的语法更一致,但我认为这将有助于更广泛地了解您的设计。Guice使用的工厂模式是混合注入参数和调用方传递的参数。普通工厂模式用于基于接口创建对象。为什么不让一个工厂和一个create方法根据create()方法中包含的逻辑实例化B
或C
?那么调用代码就不需要知道它是在创建B
还是C
。如果您可以为您的类提供更多的上下文,并提供有关最终目标的详细信息,如果你愿意,我可以试着写一个我将如何实现它的答案。让单个工厂创建所有必需的对象肯定是一个选项(假设所需的参数可以通过调用代码传递)。我们将把在模块设置中做出的决定推送到Factory.create代码中。但如果我不使用AssistedInject,将工厂分开会更干净。我将能够使用带注释的工厂。合并工厂以使用AssistedInject似乎是不对的。在我看来,能够注释您注入的工厂实例没有任何好处。这与您的问题相同#1-应用程序代码需要知道要注入哪个实例。它只是根据注释对其进行配置,但这实际上与调用createB
vscreateC
相同。或者知道注射/使用BFactory
vsCFactory
。这与#2。。。了解您需要的类型是一个需要在某个地方处理的跨领域问题。是的,但使用注释来做到这一点是否与Guice的语法更一致?虽然注释与Guice的语法更一致,但我认为这将有助于更广泛地了解您的设计。Guice使用的工厂模式是混合注入参数和调用方传递的参数。普通工厂模式用于基于接口创建对象。为什么不让一个工厂和一个create方法根据create()方法中包含的逻辑实例化B
或C
?那么调用代码就不需要知道它是在创建B
还是C
。如果您可以为您的类提供更多的上下文,并提供有关最终目标的详细信息,如果你愿意,我可以试着写一个我将如何实现它的答案。让单个工厂创建所有必需的对象肯定是一个选项(假设所需的参数可以通过调用代码传递)。我们将把在模块设置中做出的决定推送到Factory.create代码中。但如果我不使用AssistedInject,将工厂分开会更干净。我将能够使用带注释的工厂。将工厂合并以使用AssistedInject似乎是不对的。