Java Guice IOC:手动(可选)创建单例

Java Guice IOC:手动(可选)创建单例,java,guice,Java,Guice,尝试开始使用Guice,并努力了解我的用例如何适合 我有一个命令行应用程序,它接受几个可选参数 比如说,我有一个工具显示客户的订单 order-tool display --customerId 123 显示ID为123的客户拥有的所有订单。现在,用户还可以指定用户名: order-tool display --customerName "Bob Smith" 但是查询订单的接口依赖于客户ID。因此,我们需要从客户名称映射到客户ID。为此,我们需要连接到客户API。因此,用户必须指定: o

尝试开始使用Guice,并努力了解我的用例如何适合

我有一个命令行应用程序,它接受几个可选参数

比如说,我有一个工具显示客户的订单

 order-tool display --customerId 123
显示ID为123的客户拥有的所有订单。现在,用户还可以指定用户名:

order-tool display --customerName "Bob Smith"
但是查询订单的接口依赖于客户ID。因此,我们需要从客户名称映射到客户ID。为此,我们需要连接到客户API。因此,用户必须指定:

order-tool display --customerName "Bob Smith" --customerApi "http://localhost:8080/customer"
启动应用程序时,我希望解析所有参数。在指定了
--customerApi
的情况下,我想在我的IoC上下文中放置一个customerApi单例,该上下文由CLI参数和API URL参数化

然后,当代码运行以按名称显示客户时,它会询问上下文是否有CustomerApi单例。如果没有,它将抛出一个异常,告诉CLI用户如果要使用
--customerName
,他们需要指定
--customerApi
。但是,如果已经创建了一个,那么它只是从IoC上下文中检索它。

听起来“选择性地创建一个单例”并不是您在这里想要做的。我是说,是的,但这很简单:

if (args.hasCustomerApi()) {
  bind(CustomerApi.class).toInstance(new CustomerApi(args.getCustomerApi()));
}
要允许可选绑定,您可能需要

我认为您真正的问题是如何构造应用程序,以便您可以对其进行部分配置,使用配置来读取和验证一些命令行标志,然后使用这些标志来完成应用程序的配置。我认为最好的方法是使用儿童注射器

public static void main(String[] args) {
  Injector injector = Guice.createInjector(new AModule(), new BModule(), ...);
  Arguments arguments = injector.getInstance(ArgParser.class).parse(args);
  validateArguments(arguments);  // throw if required arguments are missing
  Injector childInjector =
      injector.createChildInjector(new ArgsModule(arguments));
  childInjector.getInstance(Application.class).run();
}
就像普通的注入器一样,如果它们本身不包含给定的绑定,则遵从父注入器。您还可以在上阅读文档