代码之家  ›  专栏  ›  技术社区  ›  Andrew

从哑数据对象获取guice创建的对象

  •  2
  • Andrew  · 技术社区  · 15 年前

    我已经下了决心,在最近的项目中使用了伪装。总体印象不错,但我遇到了一个问题,我不能完全理解。

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

    我遇到的问题是命令对象需要访问这些内部数据结构。这些结构是由guice创建的,因为它们根据被仿真的硬件的实际实例而变化。guice不会创建命令对象,因为它们本质上是哑对象:它们接受文本字符串,解析它,并在数据结构上调用方法。

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

    我错过了什么?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jesse Wilson    15 年前

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

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

        2
  •  0
  •   Marcin    15 年前

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

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

    也许斯考普斯能以某种方式激励你?看 into documentation some code examples 阅读技术细节。在代码中,它看起来更不像那样。以下是这对您的案例可能起作用的方法:

    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,而且效果很好。