Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Guice中管理同一依赖关系树的多个版本的最佳模式是什么?_Java_Dependency Injection_Guice - Fatal编程技术网

Java 在Guice中管理同一依赖关系树的多个版本的最佳模式是什么?

Java 在Guice中管理同一依赖关系树的多个版本的最佳模式是什么?,java,dependency-injection,guice,Java,Dependency Injection,Guice,我想举例说明同一种依赖关系树/链的几个版本,它们对该树/链中的某些接口使用不同的实现。在这种情况下,最佳的Guice实践/模式是什么 这是我的问题的一个具体例子 我有一个Writer接口,它可能是一个文件编写器或一个std out编写器,它将位于依赖关系层次结构的叶子上。大概是这样的: interface Writer { ... } class FileWriter implements Writer { ... } class StdOutWriter implements Writer {

我想举例说明同一种依赖关系树/链的几个版本,它们对该树/链中的某些接口使用不同的实现。在这种情况下,最佳的Guice实践/模式是什么

这是我的问题的一个具体例子

我有一个
Writer
接口,它可能是一个文件编写器或一个std out编写器,它将位于依赖关系层次结构的叶子上。大概是这样的:

interface Writer { ... }
class FileWriter implements Writer { ... }
class StdOutWriter implements Writer { ... }
interface ClientFactory{
  public Client stdOutClient();
  public Client fileClient(); 
  //or fileClient(File outputFile) for extra points ;)
}
另一个记录器接口用于在写入程序上添加一层间接寻址。例如:

interface Logger { ... }

class LoggerImpl{
  @Inject
  public Logger(Writer out){ ... }
  public void log(String message){ out.println(message); }
}
然后是一个使用记录器的客户端

class Client{
  @Inject
  public Client(Logger logger){ ... }
  public void do(){ logger.log("my message"); }
}
现在,我想在我的程序中使用两种类型的层次结构:

  • 客户端->日志复制->文件编写器
  • 客户端->日志导入->标准写入程序
  • 有没有一种很好的方法可以在不为1和2使用单独的Guice模块的情况下将其连接起来

    理想情况下,我希望有这样一个
    ClientFactory
    类:

    interface Writer { ... }
    class FileWriter implements Writer { ... }
    class StdOutWriter implements Writer { ... }
    
    interface ClientFactory{
      public Client stdOutClient();
      public Client fileClient(); 
      //or fileClient(File outputFile) for extra points ;)
    }
    
    有没有人能想出一个办法,利用这个工厂,或者通过其他任何方式,把这个连接起来

    我还希望有一个解决方案,可以扩展到我有更多种类的更长的依赖树/链的情况。谢谢

    这就是问题所在。解决方案基本上是使用s绑定每个依赖关系树,并仅公开该树的根。有几种方法可以做到这一点,但下面是一个示例,说明您通常可以如何做到这一点(根据您的需要,您可以在这方面做很多变化):

    public类ClientModule扩展了PrivateModule{
    私人最终撰稿人;
    
    私有最终类感谢您的精彩解释!我现在终于理解了私有模块和机器人腿问题。这为我解决了问题。但我之所以想使用fileClient(文件)变体,是因为我可能在运行时根本没有使用客户端的@FileOut变体(比如,这取决于命令行参数)。我可以实例化不同的GUI模块,这取决于是否有提供的文件,但它不是很优雅,而且随着依赖关系树变体数量的增加,它会变得非常糟糕。