Как добавить контексты запроса, когда они имеют различную реализацию получателя
В 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
Метод возвращает свой аргумент для удобства, но на самом деле это то же значение, которое вы передали в качестве аргумента. Это только для того, чтобы разрешить писать одну строку выше, вместо того, чтобы принудительно использовать две строки.