Уведомление десериализации объекта на стороне клиента WCF - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть клиентское приложение WPF, получающее объекты через ссылку на удаленную службу WCF. Ссылки на службы WCF были созданы с помощью Visual Studio «Добавить ссылку на службу ...».

Я хотел бы выполнять фрагмент кода каждый раз, когда объект получен / десериализован из службы WCF. Объект должен быть уже десериализован, чтобы я мог читать свойства / вызывать методы для него. Это решение будет глобальным, а не тем, что мне нужно будет добавлять к каждому вызову службы WCF.

Ответы [ 2 ]

4 голосов
/ 10 февраля 2012

Начиная с первоначального ответа Майка, я смог найти следующее решение.

Фон

  1. Клиент извлекает данные с сервера через службу WCF.
  2. Ссылка на службу WCF создается Visual Studio с "повторным использованием типов в ссылочных сборках", поэтому манипулирование прокси WCF невозможно.
  3. Свойство в приложении на стороне клиента необходимо изменить, когда изменилось какое-либо свойство любого из объектов, полученных из WCF (эти объекты реализуют INotifyPropertyChanged)

заблаговременности

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

[DataContract]
public class DataTransferObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
        dynamic app = Application.Current;
        if(app != null) //Prevents execution on server-side.  This code is meant to only execute at the client
        {
            PropertyChanged += (sender, args) =>
                                   {
                                       app.IsAnythingDirty = true;
                                   };
        }
    }
}

Ключи

  1. Причиной этого является динамическое ключевое слово. Вы должны использовать динамическое ключевое слово, потому что проект, содержащий DTO, не может ссылаться на Пользовательский интерфейс проекта из-за циклической ссылки. Если он не может ссылаться на проект пользовательского интерфейса, то компилятор не знает о логическом значении IsAnythingDirty.
  2. Проверка того, имеет ли значение Application.Current значение NULL, гарантирует, что код будет выполняться только на стороне клиента, а не на стороне сервера.
3 голосов
/ 10 февраля 2012

Вы можете использовать атрибут OnDeserialized:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializedattribute.aspx

...