用 Guice 代替抽象工厂?

2024-02-10

我是 Guice 的新手,我想知道我能走多远。 我有一个界面UserInfo具有多个实现类GoogleUserInfo, FacebookUserInfo, TwitterUserInfo等等。这些类是使用工厂创建的

public class UserInfoFactory {
  public UserInfo createFromJsonString(String jsonspec) {
    .
    .
    .

  }
}

创建由 JSON 字符串控制jsonspec它控制哪个实现类UserInfo被返回。具体来说,有一个JSON字符串元素domain它控制着创作。创建实际上是反序列化的函数jsonspec使用GSON。
我想知道是否有一个好方法可以用 Guice 依赖注入替换这个创建?


您可以将 Guice 集成到工厂中,但您的代码可能会更好,就像在本例中一样。

这实际上是那些不能轻易替换的工厂之一,因为它必须包含解析出jsonSpec并据此更改它返回的具体类型。假设稍微简化一点的工厂版本如下所示:

public class UserInfoFactory {
  public UserInfo createFromJsonString(String jsonspec) {
    if(getUserType(jsonSpec) == TWITTER) {
      return new TwitterUserInfo(jsonSpec);
    } else { /* ... */ }
  }

  private UserInfoType getUserType(String jsonSpec) { /* ... */ }
}

这种逻辑必须存在于某个地方,并且是你自己的UserInfoFactory似乎是一个完美的家。然而,因为你使用new,你将无法注入任何TwitterUserInfo的依赖项,或其依赖项的依赖项 - 以及thatGuice 很好地解决了这一类问题。

You can inject TwitterUserInfo as a Provider,这将使您能够访问尽可能多的完全注入的TwitterUserInfo你想要的对象:

public class UserInfoFactory {
  @Inject Provider<TwitterUserInfo> twitterUserInfoProvider;

  public UserInfo createFromJsonString(String jsonspec) {
    if(getUserType(jsonSpec) == TWITTER) {
      TwitterUserInfo tui = twitterUserInfoProvider.get();
      tui.initFromJson(jsonSpec);
      return tui;
    } else { /* ... */ }
  }
}

...当然,这也允许您注入@Twitter Provider<UserInfo>如果您只需要接口并希望将来某个时候更改具体类。如果你想TwitterUserInfo接受构造函数参数,辅助注射 https://code.google.com/p/google-guice/wiki/AssistedInject will帮助您创建一个TwitterUserInfoFactory不过,这将有助于它不变性 http://www.javapractices.com/topic/TopicAction.do?Id=29:

public class UserInfoFactory {
  @Inject TwitterUserInfo.Factory twitterUserInfoFactory;

  public UserInfo createFromJsonString(String jsonspec) {
    if(getUserType(jsonSpec) == TWITTER) {
      return twitterUserInfoFactory.create(jsonSpec);
    } else { /* ... */ }
  }
}

// binder.install(new FactoryModuleBuilder().build(TwitterUserInfoFactory.class));
public class TwitterUserInfo implements UserInfo {
  public interface Factory {
    TwitterUserInfo create(String jsonSpec);
  }

  public TwitterUserInfo(@Assisted String jsonSpec, OtherDependency dep) { /* ... */ }
}

最后一点: TwitterUserInfo可能没有任何依赖关系——对我来说这听起来像是一个数据对象——所以让你的类完全按照你找到它的方式(用new)可能是最好的方法。虽然使用解耦的接口和类来简化测试固然很好,但维护和理解是有成本的。 Guice 是一把非常强大的锤子,但并不是所有的东西都是可以敲打的钉子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 Guice 代替抽象工厂? 的相关文章

  • 插件设计模式解释(如 Martin Fowler 所描述)

    我正在尝试理解并练习插件模式 https martinfowler com eaaCatalog plugin html 正如马丁 福勒所解释的那样 我可以理解它以何种方式利用分离的接口 https martinfowler com eaa
  • Play 框架依赖注入

    我一直在 Google 上寻找一些关于如何在 Play Framework 2 1 中使用 Guice Spring DI 的有用信息 我想要做的是在一些 DAO 中注入多个服务 反之亦然 只需要对此进行一些澄清 在 play 2 1 中
  • 如何使用 Guice 创建递归对象图?

    假设我有 5 个类 A B C D E 它们都实现了一个公共接口 X 每个类 B C D 和 E 都有一个 X 类型的字段 因此它们可以被视为包装类 创建哪些实例是在运行时确定的 因此我可以拥有以下对象图之一 E gt D gt C gt
  • 在Android中使用GWT源代码

    我有一个基于 GWT 的网络应用程序 我使用相同的代码库来定位桌面和移动平台 我使用基于GIN的Model View Presenter和依赖注入来实现跨平台兼容的目标 然而 为了在 Android 上获得更好的性能和原生外观 我想编写一个
  • guice:命令行运行时注入/绑定

    我有以下问题 Inject MyClass Service service this service service public void doSomething service invokeSelf 我有一个模块 bind servic
  • Guice Servlet 的简单示例

    我不知道如何继续一个简单的示例 阅读文档后 我完成了以下操作 设置 guiceFilter 创建了一个注入器并实例化了一个新的 ServletModuleGuiceServletContextListener并将监听器添加到 web xml
  • 具有 Autofac 依赖项的工厂

    我想编写一个工厂来创建各种类型的 xxNotification 类 我的具体 xxNotification 具有使用 AutoFac 注册的依赖项 我想使用 Autofac 获取 解析 xxNotification 的实例 怎么做 publ
  • Google Guice 是否处于活动状态?

    一年多没有发布任何版本 甚至没有修复小错误 对存储库的提交很少 并且过去两个月没有提交 使用这个库开始新项目安全吗 Guice 4 现在处于测试阶段 请参阅https github com google guice https github
  • Guice - 使用静态辅助方法将依赖项注入到类中

    我对 Guice 还很陌生 之前没有使用过任何 DI 框架 在阅读了官方 wiki 和许多其他文档后 我仍然无法完全理解它 在我的特定情况下 我想编写一个使用其他 待注入 类的 EL taglib 函数 由于所有 taglib 函数都必须声
  • 如何使用 ServletScopes.scopeRequest() 和 ServletScopes.continueRequest()?

    应该如何使用ServletScopes scopeRequest http google guice googlecode com git javadoc com google inject servlet ServletScopes ht
  • 如何使用 Scala Guice 绑定一个使用单子类型参数扩展 Trait 的类?

    我需要绑定这个特征的实现 trait ClientRepository F def list F Iterable ClientDTO 对于这个实现 import cats effect IO Singleton class ClientR
  • 构造函数注入——我们也注入工厂吗?

    听完后整洁代码讲座 https www youtube com playlist list PL693EFD059797C21E 我开始明白我们应该使用工厂来组合对象 因此 举例来说 如果House has a Door and a Doo
  • Angular 8 - 服务注入和工厂模式

    我已经简要阅读了几篇文章和官方 Angular 指南 但它们似乎无法帮助我解决我的任务 这就是我想要的和所做的 假设我有带有产品列表页面的 Angular 应用程序 此外 这个应用程序将来还会有类别列表页面和一些N列表页面 正如您所看到的
  • 在 Play 应用程序中启动时调用服务

    我有一个 Play 2 4 应用程序 尝试在应用程序启动时启动每周任务 当前的建议是在急切注入的类的构造函数中执行此操作 Guice 但是 我的任务需要访问服务 如何将该服务注入到我的任务中而不出现错误 Error injecting co
  • PHP5中单例与工厂模式结合

    在 PHP5 中将单例设计模式与工厂方法模式结合使用的最佳方法是什么 我最简单的使用场景是对每种数据库类型仅实例化选择性数据库连接一次 用于数据库连接的单例工厂 class Registry private static objects p
  • 如何将 Jersey ExceptionMapper 与 Google Guice 结合使用?

    我正在使用 Jersey Guice 并且需要配置自定义ExceptionMapper 我的模块如下所示 public final class MyJerseyModule extends JerseyServletModule Overr
  • 龙目岛和吉斯注射液

    我是 lombok 和 guice 注入的新手 我可以了解一般概念 但我遇到了一些我不理解的代码 并且由于语法而无法搜索 以下是代码 有人可以帮助我理解吗 import com google inject Inject import lom
  • JAX-WS 和 Guice 3

    是否有某种方法可以获取使用 JAX WS 创建的 SOAP Web 服务类 并使用 Guice 3 0 guice persist 事务或什至只是简单的依赖注入来注入它们 guiceyfruit 包提供了一个 GuiceManaged 注释
  • Guice:Binder#bindConstant() 和 Binder#bind() 之间的区别 ... toInstance

    我想问一下有什么区别 bindConstant annotatedWith Names named keepAliveInterval to 60 and bind Integer TYPE annotatedWith Names name
  • 工厂模式但带有对象参数

    采用以下经典工厂模式 public interface IPizza decimal Price get public class HamAndMushroomPizza IPizza decimal IPizza Price get re

随机推荐

  • PHP 以奇怪的波特率进行串行

    我正在尝试使用 PHP 将文本发送到 LED 标志 以便我可以向其发送支持票号 标志本身就是一件作品 它来自 eBay 制作很差 几乎没有文档 经过一段时间的摆弄后 我能够弄清楚它期望的东西发送给它的方式 并且波特率为 28800 我已经知
  • 使用 PHP gd 库提高图像质量

    不知道在哪里 但我发现了一个图像托管网站 它允许您以大格式上传图像或锐化图像 我个人不记得或不知道 GD 库有任何锐化图像的功能 这可能只是质量提升的不同词 如果有人知道锐化图像的功能 请告诉我 因为我个人在 Image Magic 和 或
  • 如何在 Javascript 中获取当前日期/时间而不使用系统时间?

    new Date 获取当前系统时间 这意味着 如果当前系统时间错误 在我的例子中 客户端计算机是Windows系统 其时间设置为当前时间的 4小时 new Date 将提供错误的值 我需要一种方法来获取客户端的当前日期 时间 而不使用他的机
  • Google Play 服务 LocationServices.API - 新选项“从不”

    已解决 答案在最后 我正在使用新方法从 Google Play Services 7 0 检索位置 http android developers blogspot com 2015 03 google play services 70 p
  • HTTP“Host”标头参数中是否需要端口号?

    假设我向以下地址发出 HTTP 请求 foosite com但我实际发送请求的端口是 6103 我不将该端口放在Host标题例如 GET barpage HTTP 1 1 Host foosite com Method GET http 服
  • Typescript 导出推断类型而不是显式类型

    我的上下文在vue router 尽管这可能并不重要 我想这样定义我的路线 import RouteLocationRaw from vue router type RouteNames dashboard flowRun type Rou
  • Expression.DebugInfo 如何标记表达式?

    所以我知道 Expression DebugInfo 的用途 并且创建了一个调试表达式 但如何使用此调试信息标记其他表达式 这是我正在尝试的一个非常基本的测试 using System using System Collections Ge
  • Python time.sleep() 与 event.wait()

    我想在我的多线程 Python 应用程序中定期执行一个操作 我见过两种不同的做法 exit False def thread func while not exit action time sleep DELAY or exit flag
  • ggplot 将标题的一部分斜体化并将文本分为两行

    我喜欢将以下标题添加到我的图表中 注 美国市场集中度平均值 王国和荷兰分别是1920年 1388年和1244年 其中 注 需要斜体 荷兰分别是1920年 1388年和1244年 应另起一行 使用paste函数 我无法将一部分斜体化 但使用
  • Eclipse 调试器不会在条件断点处停止

    我在 Eclipse 中有这段 Java 代码 我想对其进行调试 这是代码 public Double repulsion Node n1 Node n2 Double rep 0 0 rep Math pow K 2 distEuc n1
  • 使用 WinAPI 挂钩对程序进行沙箱处理

    我想对本机代码进行沙箱处理 并使用 WinAPI 和系统函数的挂钩来阻止或允许该程序执行某些操作 例如读 写文件 修改 Windows 注册表 使用 Internet 连接 这是一种良好且安全的方法吗 该程序绕过这样的安全层有多困难 我已经
  • StringReplace 的二进制版本

    我正在尝试在保存大量数据的 RawByteString 上运行 AnsiStrings StringReplace 其中一些数据需要替换 它会起作用 除了在 StringReplace 内部它将我的字符串转换为 PAnsiChar 因此搜索
  • 带有特定顺序和百分比注释的 ggplot2 饼图

    我有一个如下所示的数据框 make model cnt toyota camry 10 toyota corolla 4 honda city 8 honda accord 13 jeep compass 3 jeep wrangler 5
  • 事务可以在同一个 SQL Server 中跨多个数据库工作吗?如果是这样,这是分布式事务吗?

    事务可以在同一个 SQL Server 中跨多个数据库工作吗 如果是这样 这是分布式事务吗 或者会基本BEGIN TRANSACTION work 同一实例中跨多个DB的事务是本地事务 BEGIN TRANSACTION 会工作得很好
  • Java 8 Collectors.toMap SortedMap

    我正在使用 Java 8 lambda 并想使用Collectors toMap返回一个SortedMap 我能想到的最好的办法就是拨打以下电话Collectors toMap使用假人的方法mergeFunction and mapSupp
  • Javascript 将动态图像从 URL 绘制到画布元素上

    我正在尝试使用其 URL 将动态 PNG 图像 由 PHP 脚本生成的图像 绘制到 Canvas 元素上 我无法真正发布我正在测试的页面的确切 URL 因为您必须登录该网站 我正在使用的动态图像 URL 之一的示例是 http www we
  • 一个关于C++中类型强制的简单问题

    给定一个函数原型和一个类型定义 int my function unsigned short x typedef unsigned short blatherskite 标准定义了以下情况 int main int argc char ar
  • Heroku 上静态资产的重定向子域

    我希望 myapp com blog 重定向到 www myapp com blog 我已经安装了 Refraction 以在机架层执行子域重定向 这在 Heroku for blog 上不起作用 因为 blog 中的文件是静态资产 有什么
  • 简单分隔符之间的匹配,但分隔符本身不匹配

    我正在查看文本文件中的 JSON 数据 除了使用正则表达式来获取引号之间的值之外 我不想做任何事情 我只是用它作为帮助练习正则表达式的一种方法 并达到了这一点 看起来它应该很简单 但事实证明它不是 至少对我和办公室的其他一些人来说 我已经在
  • 用 Guice 代替抽象工厂?

    我是 Guice 的新手 我想知道我能走多远 我有一个界面UserInfo具有多个实现类GoogleUserInfo FacebookUserInfo TwitterUserInfo等等 这些类是使用工厂创建的 public class U