Обновление крупного объекта через сервис - PullRequest
2 голосов
/ 03 января 2012

Мы строим n-уровневую систему на основе WCF (но не Entity Framework), и мы столкнулись с обсуждением лучшего способа реализации обновлений крупных объектов.Мы создали DTO и отображаем данные из нашей доменной модели в эти, когда данные отправляются клиенту.Затем клиент вносит некоторые изменения и отправляет их обратно, используя тот же DTO, в нашей текущей реализации.Некоторые из наших объектов могут иметь 80-100 свойств, но, возможно, клиент вносит изменения только в одно или несколько из них.Кажется неэффективным заполнить весь DTO и отправить его обратно, а затем попытаться выяснить на стороне сервера, какие свойства были фактически изменены.Есть ли лучший способ реализовать это или мы должны использовать метод "грубой силы"?В будущем нам необходимо поддерживать не .Net-клиентов, поэтому мы не хотим связывать наше решение с чем-то специфичным для .net.

Ответы [ 3 ]

0 голосов
/ 03 января 2012

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

0 голосов
/ 03 января 2012

Мы решили эту проблему, включив строковый массив измененных имен свойств в каждый DTO. Код обновления в службе только проверяет и записывает свойства, имена которых находятся в этом массиве.

Чтобы упростить кодирование, мы поместили этот массив строк в абстрактный базовый класс и унаследовали от него все «изменяемые» DTO. Например:

<DataContract>
Public MustInherit Class ChangeTrackableObject
    <DataMember> Public Property Changes As HashSet(Of String)
End Class

Атрибутов <KnownType> нет, поскольку в этом случае полиморфизм DTO не требуется. DataContractSerializer просто использует отношение наследования для получения свойства базового класса, ничего более.

Эта система работает одинаково хорошо из клиентского кода .NET и Java. Java-клиенты видят это как строковый массив. У нас есть библиотека методов расширения для клиентов .NET, чтобы упростить заполнение данных.

0 голосов
/ 03 января 2012

Одна вещь, которую вы можете сделать, это разрешить клиенту отправлять дельта-обновления.Все ваши объекты могут иметь уникальный идентификатор, которым управляет сервер.

У вас может быть такой метод WCF, чтобы отправлять дельту

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

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

...