Guice:在特定条件下回退到默认实现

时间:2016-07-19 06:07:39

标签: guice

我是guice的新手。

我有一个文件(json文件),我在其中定义了一些数据。这是可选的。如果文件存在,我必须从文件中读取数据(使用FileBasedImpl)。否则,我应该从" DefaultImpl"中获取数据。 class,我返回硬编码数据。

如何通过guice绑定实现这一目标?

interface SomeService {
  Map<String, String> getData();
}

class FileBasedImpl implements SomeService {
   /* Reads from a file */
   Map<String, String> getData() {
      //Check if file is present, then read the data
   }
}

class DefaultImpl implements SomeService {
  /* Returns hard-coded data */
  Map<String, String> getData() {
    return new HashMap()<>..;
  }
}

1 个答案:

答案 0 :(得分:1)

您可以创建一个提供程序(通过实现接口或向模块添加一个提供方法),该提供程序尝试读取内容并根据结果提供一个或另一个bean:

...
@Provides
public SomeService someService() {
    File file = ....;
    return (file.exists) ? new FileBasedImpl(file) : new DefaultImpl();
}
...

但要注意,模块中的条件逻辑是documented anti-pattern。但在这种情况下,这是一个很好的工作解决方案,有时候必须要做......