Как добавить контексты запроса, когда они имеют различную реализацию получателя

В google io 2011 Дэвид Чендлер упомянул, что вы можете связать разные контексты запросов с помощью метода append(), но на практике я не знаю, как их объединить, когда у них разные получатели, с помощью to() и затем fire()?

Пожалуйста помоги.

1 ответ

Решение

Существует два вида получателей: те, которые связаны с каждым вызовом метода (который вы передаете Request "s to() метод), и один уровень контекста (который вы передаете RequestContext "s fire() метод). Request "s fire(Receiver) метод является сокращением для to(receiver).fire() то есть связывает Receiver к методу.

Приемники уровня метода зависят только от метода, их общая параметризация зависит от возвращаемого значения метода (общая параметризация Request или же InstanceRequest) так ли ты append() несколько RequestContext Вместе они ничего не меняют.

Приемник уровня контекста всегда параметрируется с Void, Когда ты append() вместе контексты, они на самом деле образуют единый контекст с несколькими интерфейсами, поэтому вы вызываете только fire() один раз, в любом из добавленных контекстов.

Теперь вернемся к основам: без использования append() Вы можете только объединять вызовы для методов, которые объявлены в контекстном интерфейсе. Если у вас есть два различных контекстных интерфейса, которые вы хотите использовать, вы должны сделать два fire() два HTTP-запроса. Вступление к append() позволяет объединять вызовы для методов, объявленных в любом контекстном интерфейсе: просто добавьте контекст к другому, и вызовы в обоих контекстах будут объединены в один и тот же HTTP-запрос, инициированный уникальным fire() на любой из добавляемого контекста.

Теперь о технических деталях: внутренне контекст - это не более чем тонкая оболочка вокруг объекта состояния. Когда ты edit() или же create() прокси-сервер, вы добавляете его во внутреннее состояние, и когда вы вызываете метод службы, имя метода (фактически, его запутанный токен) и аргументы перехватываются и передаются в состояние. Когда ты append() контекст, вы только заставляете его делиться своим внутренним состоянием с тем контекстом, к которому вы его добавляете. Таким образом, когда вы вызываете метод службы в добавленном контексте, он помещается в то же состояние, что и другой контекст, и когда вы fire() любой из них, состояние сериализуется в один HTTP-запрос.
Обратите внимание, что для добавления контекста его собственное внутреннее состояние должно быть пустым, в противном случае будет сгенерировано исключение, так как состояние будет отброшено для замены одним из другого контекста.

Вкратце и на практике:

FirstContext first = rf.first();
SomeProxy proxy = first.create(SomeProxy.class);
...
SecondContext second = first.append(rf.second());
OtherProxy other = second.create(OtherProxy.class);
other.setSome(proxy);
...
second.saveAndReturnSelf(other).to(new Receiver<OtherProxy>() {
   ...
});
...
first.fire();

Обратите внимание, что строка, которая создает и добавляет второй контекст, может быть в равной степени записана:

SecondContext second = rf.second();
first.append(second);

append Метод возвращает свой аргумент для удобства, но на самом деле это то же значение, которое вы передали в качестве аргумента. Это только для того, чтобы разрешить писать одну строку выше, вместо того, чтобы принудительно использовать две строки.

Другие вопросы по тегам