配置类 - 使用Guice的最佳实践

4
背景信息:我正在使用Google Guice,因此通过配置类进行传递更加容易,但我认为这并不是最好的方法。
我有一个配置类用于存储一些路径:
class Configuration{
   String getHomePath();
   String getUserPath();
}

我有一个类"a"需要"homepath",还有一个类"b"需要"userpath"。
是通过构造函数将配置类传递给a和b,还是仅传递特定路径更好?
3个回答

3
如果你正确使用Guice,所有类似于这样的配置都应该出现在模块的configure 方法中。因此:
  1. 删除配置类。
  2. 创建注释类,可能称为HomePathUserPath
  3. 当类a使用getHomePath()时,将其替换为命名为homePath的String字段成员。
  4. 当类b使用getUserPath()时,将其替换为命名为userPath的String字段成员。
  5. 修改类a和b的构造函数以被注解为@Inject(已经是)并分别使用一个带有@HomePath@UserPath 注释的String参数,在注入值时将字符串字段成员赋值。
  6. 在您的模块的configure方法中创建绑定,使用.annotatedWith()定义正确的值;如果它们仅在运行时可用,则绑定提供程序。
例如:
class a {
  private String homePath;
  @Inject
  public a(@HomePath String homePath) {
    this.homePath = homePath;
  }
  public String tellMeAboutHome() {
    return "We live in a nice home called " + homePath;
  }
}

class customModule extends AbstractModule {
  public static final String userPath = "/home/rafael";

  public void configure() {
    bind(String.class).annotatedWith(HomePath.class).to("/home/");
    bind(String.class).annotatedWith(UserPath.class).to(userPath);
  }
}

如果创建注释对你来说太麻烦了,可以使用Guice附带的@Named注释。详见官方文档

1

一般规则是编写代码以使依赖图(哪些类知道或依赖于其他类/接口)尽可能简单、规则和固定。

如果不传递 Configuration 类会使 a 或 b 对用户编写的类没有任何依赖,或者为了避免依赖循环,则使用单独的路径字符串。否则,如果更合理的说法是“这个类可以访问配置信息,但未来可能会发生变化”,则传递该类。

我会避免使用单例模式,特别是如果您已经设置了 Guice。


1

针对你的问题,没有一个单一的答案,只有根据你特定情况选择的选项。

如果你知道你的Configuration类将会增长并且如果你的AB类可能会使用更多它的内容,那么就将整个Configuration对象传递给它们的构造函数。注意:我知道这违反了YAGNI原则,但有时你可能知道你会需要它;-)

否则,你可以考虑使用@Named注入你的路径,以便将AB类的依赖降到最低,这是一个良好的设计实践。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接