繁体   English   中英

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

[英]Configuration class - best practice with Guice

背景:我正在使用Google Guice,因此更容易通过配置类,但我认为这不是最好的方法。

我有一个存储一些路径的配置类:

class Configuration{
   String getHomePath();
   String getUserPath();
}

我还有一个类“a”需要“homepath”和一个类“b”需要“userpath”。

是通过类a和b的构造函数传递配置类还是仅通过特定路径更好?

如果您真的正确使用Guice,那么所有这样的配置都应该出现在模块的configure方法中。 所以:

  1. 删除配置类。
  2. 创建注解类,大概是叫HomePathUserPath
  3. 其中类a使用getHomePath()将其替换为名为homePath的String字段成员。
  4. 其中类b使用getUserPath()将其替换为名为userPath的String字段成员。
  5. 将类a和b构造函数修改为@Inject annotated(应该已经是)并接受一个String参数,分别用@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);
  }
}

如果为您创建注释太多,请使用随附的@Named注释Guice。

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

如果没有传递Configuration类使得a或b对用户编写的类没有依赖关系,或者为了避免依赖循环,则使用各个路径字符串。 否则,如果更有意义地说'此类可以访问配置信息,以某种可能在将来发生变化的方式',则传递该类。

我会避免使用单例方法,特别是如果你已经设置了Guice。

您的问题没有单一的答案,根据您的具体情况,只有可供选择的选项。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM