Передача нескольких карточек с клиента на сервер
Передача нескольких карточек с клиента на сервер¶
Рассмотрим случай, когда требуется написать кастомный запрос CardRequest, который на клиенте формирует несколько карточек Card (или любых других сериализуемых объектов-наследников StorageObject), а затем отдаёт их на сервер для пакетной обработки. Сервер можно создать SQL-транзакцию, в пределах которой сохранить несколько карточек и гарантировать, что будут сохранены все карточки или не будет сохранено ни одной.
Для этого в Tessa.Extensions.Shared пишут статический класс с фабрикой объектов, которые будут размещаться в запросе, который передаётся с клиента на сервер.
public static readonly IStorageValueFactory<int, Card> CardFactory =
new DictionaryStorageValueFactory<int, Card>(
(key, storage) => new Card(storage));
Потом в клиентском коде (Tessa.Extensions.Client) создают объект ListStorage<T> и наполняют его, в нашем случае объектами Card.
Card card1 = ...;
Card card2 = ...;
var listStorage = new ListStorage<Card>(new List<object>(), CardFactory);
listStorage.Add(card1);
listStorage.Add(card2);
request.Info["Cards"] = listStorage.GetStorage();
В серверном обработчике, который получает запрос с клиента, объект ListStorage<T> создаётся из сериализованных данных, и дальше по нему можно итерироваться через foreach.
var list = request.Info.Get<IList<object>>("Cards");
var listStorage = new ListStorage<Card>(list, CardFactory);
foreach (Card card in listStorage)
{
// обрабатываем каждую из карточек
}