Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从哑数据对象获取GUI创建的对象_Java_Dependency Injection_Inversion Of Control_Guice - Fatal编程技术网

Java 从哑数据对象获取GUI创建的对象

Java 从哑数据对象获取GUI创建的对象,java,dependency-injection,inversion-of-control,guice,Java,Dependency Injection,Inversion Of Control,Guice,我冒险用Guice做了我的最新项目。总体印象不错,但我遇到了一个问题,我无法完全理解 背景:它是一个Java6应用程序,通过网络接受命令,解析这些命令,然后使用它们修改一些内部数据结构。这是我们公司生产的一些硬件的模拟器。我对内部数据结构所做的更改与命令对实际硬件的影响相匹配,因此数据结构的后续查询应该反映基于以前运行的命令的硬件状态 我遇到的问题是命令对象需要访问这些内部数据结构。这些结构是由Guice创建的,因为它们根据被仿真硬件的实际实例而有所不同。命令对象不是由Guice创建的,因为它们

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

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

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

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


这里我遗漏了什么?

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


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

假设响应命令与响应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,而且效果很好。

如果您的价值对象因模拟的硬件而异,您可以编写一个工厂来创建它们,并让Guice将工厂注入到需要它的代码中。换句话说,避免注入值对象的一种方法是创建一个产生值对象的服务。