Мы создаем n-уровневую систему на основе WCF (но не Entity Framework), и мы столкнулись с обсуждением лучшего способа реализации обновлений больших объектов. Мы создали DTO и отобразили данные из нашей модели домена в тезе, когда данные отправляются клиенту. Затем клиент вносит некоторые изменения и отправляет их обратно с использованием того же DTO в нашей текущей реализации. Некоторые из наших объектов могут иметь 80-100 свойств, но, возможно, клиент только вносит изменения в один или несколько из них. Кажется неэффективным заполнить весь DTO и отправить его обратно, а затем попытаться выяснить на стороне сервера, какие свойства были изменены. Есть ли лучший способ реализовать это или нужно идти с методом "грубой силы"? В будущем нам нужно поддерживать клиентов non.Net, поэтому мы не хотим связывать наше решение с чем-то специфичным .net.
Обновление крупного объекта через сервис
Ответ 1
Мы решили эту проблему, включив в каждый DTO строковый массив измененных имен свойств. Код обновления в службе только проверяет и записывает свойства, имена которых находятся в этом массиве.
Чтобы упростить кодирование, мы помещаем этот массив строк в абстрактный базовый класс и унаследовали от него все "изменяемые" DTO. Например:
<DataContract>
Public MustInherit Class ChangeTrackableObject
<DataMember> Public Property Changes As HashSet(Of String)
End Class
Нет атрибутов <KnownType>
, поскольку в этом случае полиморфизм DTO не требуется. DataContractSerializer
просто использует отношение наследования, чтобы вытащить свойство базового класса, не более того.
Эта система, похоже, одинаково хорошо работает с клиентским кодом .NET и Java. Клиенты Java рассматривают это как строковый массив. У нас есть библиотека методов расширения для клиентов .NET, чтобы упростить заполнение данных.
Ответ 2
Одна вещь, которую вы можете сделать, это позволить клиенту отправлять дельта-обновления. Все ваши объекты могут иметь уникальное руководство, которое сервер выполняет.
У вас может быть такой метод WCF, чтобы отправить deltap >
void UpdateProperty( Guid objguid ,
string propertyname , string propertyvalue );
На стороне сервера вы можете найти объект с помощью guid и обновить соответствующее свойство.
Ответ 3
Если вы так велики, вы можете попробовать использовать XML в качестве параметра веб-метода вместе с XSD, который имеет необязательные элементы. Это не будет привязано к конкретной платформе. Вы можете просто отправить элементы, которые были изменены вместе с уникальным идентификатором ключа.