Предполагая, что ответ на команду ничем не отличается от ответа на запрос 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, и это прекрасно работало.