Обновление крупного объекта через сервис

Мы создаем 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, чтобы отправить delta​​p >

  void UpdateProperty( Guid objguid ,
            string propertyname , string propertyvalue );

На стороне сервера вы можете найти объект с помощью guid и обновить соответствующее свойство.

Ответ 3

Если вы так велики, вы можете попробовать использовать XML в качестве параметра веб-метода вместе с XSD, который имеет необязательные элементы. Это не будет привязано к конкретной платформе. Вы можете просто отправить элементы, которые были изменены вместе с уникальным идентификатором ключа.