Java 在Guice中管理同一依赖关系树的多个版本的最佳模式是什么?
我想举例说明同一种依赖关系树/链的几个版本,它们对该树/链中的某些接口使用不同的实现。在这种情况下,最佳的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 {
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"); }
}
现在,我想在我的程序中使用两种类型的层次结构:
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模块,这取决于是否有提供的文件,但它不是很优雅,而且随着依赖关系树变体数量的增加,它会变得非常糟糕。