Есть одно решение, о котором я могу подумать, но оно кажется немного странным, и я не совсем уверен.
Сервер предлагает общий метод подписки для каждого из списков. Имя списка передается в качестве параметра. При изменении любого списка сервер отправляет имя измененного списка вместе с измененным элементом. Проблема в том, что элемент не может быть передан обычно, потому что в контракте обратного вызова есть только один метод «ListWasChanged» (я абсолютно хочу избежать использования нового метода обратного вызова для каждого из списков, см. Вопрос).
Однако это можно решить, передав измененный элемент, сериализованный как строка. Используя NetDataContractSerializer, клиент может легко восстановить сериализованный элемент и передать его соответствующему обработчику для каждого списка.
Что вы думаете об этом? Это возможно? Сначала я думал, что это слишком сильно ухудшает производительность, но потом подумал, что мы все равно должны сериализовать каждый элемент. Единственное добавленное снижение производительности - сериализация строки, которая не должна быть слишком большой.
Поскольку это может показаться немного запутанным, вот реализация в псевдокоде:
Сервер:
// let's call it SyncList - a list that sends updates on changes
class SyncList<T> : List<T>
{
// this is called on every change of the list
void OnListChanged<T (string name, T item)
{
// serialize the item
string ser = NetDataContractSerializer.Serialize(item);
// send the item together with the name of the list
WcfCallbackChannel.ListChanged (name, ser);
}
}
клиент:
// this stores each of the lists
Dictionary<string, List<T>> _Lists;
// the list callback implementation
class WcfCallbackImplementation : IWcfCallbackContract
{
// called on every change of ANY list
void ListChanged (string name, string item)
{
// get the item back
var item = NetDataContractSerializer.Deserialize (item);
// add/remove/update item
_Lists[name].Add (item);
}
}