2

我已经冒险并在我的最新项目中使用了 Guice。总体印象不错,但我遇到了一个我无法完全理解的问题。

背景:它是一个 Java6 应用程序,通过网络接受命令,解析这些命令,然后使用它们修改一些内部数据结构。这是我们公司生产的一些硬件的模拟器。我对内部数据结构所做的更改与命令对真实硬件的影响相匹配,因此数据结构的后续查询应该反映基于先前运行的命令的硬件状态。

我遇到的问题是命令对象需要访问那些内部数据结构。这些结构是由 Guice 创建的,因为它们根据被模拟的硬件的实际实例而有所不同。命令对象不是由 Guice 创建的,因为它们本质上是愚蠢的对象:它们接受文本字符串,解析它,然后调用数据结构上的方法。

我能让这一切正常工作的唯一方法是让这些命令对象由 Guice 创建并通过注入传递数据结构。感觉真的很笨重,并且完全膨胀了数据对象的构造函数。

我在这里错过了什么?

4

2 回答 2

1

依赖注入最适合布线服务。它可以用来注入值对象,但这可能有点尴尬,特别是如果这些对象是可变的。

也就是说,您可以使用 Providers 和@Provides方法来绑定您自己创建的对象。

于 2009-07-21T06:48:40.843 回答
0

假设响应命令与响应 http 请求没有什么不同,我认为您走的是正确的道路。

http 应用程序中常用的模式是将应用程序的逻辑包装到短期对象中,这些对象具有来自请求的参数和一些注入的后端。然后你实例化这样的对象并调用一个简单的、无参数的方法来完成所有的魔法。

也许范围可以以某种方式启发您?查看文档一些代码示例以阅读技术细节。在代码中,它看起来不像那样。以下是这可能适用于您的情况:

class MyRobot {
   Scope myScope;
   Injector i;       

   public void doCommand(Command c) {
      myScope.seed(Key.get(Command.class), 
      i.getInstance(Handler.class).doSomething();
   }
}


class Handler {
   private final Command c;
   @Inject
   public Handler(Command c, Hardware h) {
     this.c = c;
   }

   public boolean doSomething() {
     h.doCommand(c);
     // or c.modifyState(h) if you want c to access internals of h
   }
}

有些人不赞成这种解决方案,但我在过去至少在两个不同的项目中严重依赖 Guice 的代码中看到了这一点。

当然,您将在构造函数中注入一些值对象,但如果您不将它们视为值对象,而是将其视为改变其行为的类的参数,那么这一切都是有道理的。

这有点尴尬,有些人不赞成以这种方式注入价值对象,但我过去曾在一段时间内严重依赖 Guice 的项目中看到过这种情况,并且效果很好。

于 2009-07-21T06:53:28.900 回答