Java 从哑数据对象获取GUI创建的对象
我冒险用Guice做了我的最新项目。总体印象不错,但我遇到了一个问题,我无法完全理解 背景:它是一个Java6应用程序,通过网络接受命令,解析这些命令,然后使用它们修改一些内部数据结构。这是我们公司生产的一些硬件的模拟器。我对内部数据结构所做的更改与命令对实际硬件的影响相匹配,因此数据结构的后续查询应该反映基于以前运行的命令的硬件状态 我遇到的问题是命令对象需要访问这些内部数据结构。这些结构是由Guice创建的,因为它们根据被仿真硬件的实际实例而有所不同。命令对象不是由Guice创建的,因为它们本质上是哑对象:它们接受文本字符串,解析它,并调用数据结构上的方法 我能让这一切正常工作的唯一方法是让那些命令对象由Guice创建,并通过注入传递到数据结构中。它感觉非常笨拙,并且完全膨胀了数据对象的构造函数Java 从哑数据对象获取GUI创建的对象,java,dependency-injection,inversion-of-control,guice,Java,Dependency Injection,Inversion Of Control,Guice,我冒险用Guice做了我的最新项目。总体印象不错,但我遇到了一个问题,我无法完全理解 背景:它是一个Java6应用程序,通过网络接受命令,解析这些命令,然后使用它们修改一些内部数据结构。这是我们公司生产的一些硬件的模拟器。我对内部数据结构所做的更改与命令对实际硬件的影响相匹配,因此数据结构的后续查询应该反映基于以前运行的命令的硬件状态 我遇到的问题是命令对象需要访问这些内部数据结构。这些结构是由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将工厂注入到需要它的代码中。换句话说,避免注入值对象的一种方法是创建一个产生值对象的服务。