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

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

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

1 Ответ

6 голосов
/ 14 декабря 2011

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

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

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

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

Теперь перейдем к техническим деталям: внутренне контекст представляет собой не что иное, как тонкую оболочку вокруг state объекта.Когда вы 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);

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

...