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
  • 在我看来,更直观的API应该是:

    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。所以

  • 是不是有什么东西让这样的API变得不合理了
  • 考虑到当前可用的功能,有没有一种方法可以近似这种行为

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