gpt4 book ai didi

java - 将依赖项注入(inject)实用程序类映射

转载 作者:行者123 更新时间:2023-12-02 09:42:35 25 4
gpt4 key购买 nike

我有一个实用程序/常量类,其中包含 Map<String, Authorizer>哪里Authorizer是一个具有几种不同实现的接口(interface)。我使用跨不同流的映射来获取包含一些 String 的对象。 (授权方法的名称),然后映射到特定的 Authorizer ,然后完成一些授权。

我正在使用 Guice 连接 Authorizer类,但这种方法阻止我使实用程序类(包含 Map )成为具有空私有(private)构造函数的真正实用程序类。我有一个看起来很时髦的解决方法,Guice 和 Checkstyle 都满意,但我想知道是否有更好的方法。

我的实用程序类:

public final class Constants {
@Inject
private Constants() {}

public static final String AUTH_METHOD_ONE = "Auth1";
public static final String AUTH_METHOD_TWO = "Auth2";

@Singleton
@Inject
@Getter // For Checkstyle, as AUTH_METHODS isn't a true static final constant
private static Map<String, Authorizer> authMethods;
}

我的常量模块:

public class ConstantsModule extends AbstractModule {
@Override
public void configure() {
requestStaticInjection(Constants.class);
final MapBinder<String, Authorizer> mapBinder = MapBinder.newMapBinder(binder(), String.class, Authenticator.class);
mapBinder.addBinding(AUTH_METHOD_ONE).to(MethodOneAuthorizer.class);
mapBinder.addBinding(AUTH_METHOD_TWO).to(MethodTwoAuthorizer.class);
}
}

以及示例用法:

public class AuthorizationOrchestrator {
private static Authorizer getAuthorizer(final AuthorizationState state) {
return state.getMethods().stream()
.map(AuthorizationApproach::getAuthorizationApproachName)
.filter(Constants.getAuthMethods().keySet()::contains)
.findFirst()
.map(Constants.getAuthMethods()::get)
.orElse(null);
}
}

此方法还需要在单元测试中使用一些 PowerMock。有没有更好的方法:

  • 将授权方法的名称映射到 Authorizer类同时将映射保留在一处?
  • 使用Constants类作为真正的实用程序类,具有 public static final Map<String, Authorizer> AUTH_METHODS同时仍然能够将授权者注入(inject) Map

最佳答案

注入(inject)一些应该是常量的东西并没有真正的意义。

通过使用静态 Constants类,您将在使用 Constants 的代码中引入非注入(inject)依赖项class,这违背了 DI 的全部要点,更不用说静态依赖项在测试中更难模拟。

还有一些其他方法可能适合您。原则上,它们都是相同的解决方案(将 Authorizer 注入(inject)到非静态的东西中),但它们有一些不同的细微差别。

  • 使用组合以避免需要实用程序类。创建 Authorizer由多个 Authorizer 组成的实现s。复合Authorizer可以在内部委托(delegate)给正确的“真实”实现。然后你可以只注入(inject)一个 Authorizer任何需要的地方。这可能无法实现,具体取决于 Authorizer 的方式契约(Contract)已定义。

  • 在实用程序类中保留没有任何状态的逻辑。将静态方法的签名更改为 getAuthorizer(AuthorizationState state, Map<String, Authorizer> availableAuthorizersByName) 。然后,注入(inject)AUTH_METHODS直接映射到将调用静态 getAuthorizer 的类方法,并将 map 作为参数之一传递给该方法。

  • 制作 getAuthorizer()不是静态的。并将 map 直接注入(inject) AuthorizationOrchestrator 的实例中.

关于java - 将依赖项注入(inject)实用程序类映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56941442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com