2012-02-09 3 views
2

У меня есть клиентское приложение WPF, получающее объекты через ссылку на удаленную службу WCF. Ссылки на службы WCF были созданы с помощью Visual Studio 'Add Service Reference ...'.WCF-десериализатор объекта на стороне клиента

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

+0

Непонятный вопрос. Вы ищете образцы кода, где кто-то это сделал? Можете ли вы быть более конкретными в своих намерениях? –

+0

Я хотел задать вопрос как можно более общий. Я ищу руководство для того, где я могу подключиться к рабочему процессу WCF (атрибут где-нибудь? Поведение). В частности, я хочу подписаться на событие INotifyPropertyChanged.PropertyChanged каждого объекта, который входит в систему, чтобы я мог определить, будут ли какие-либо входящие объекты были изменены пользователем. –

+0

Я вижу. взгляните на ответ Майка ... это может быть именно то, что вы ищете. –

ответ

4

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

фон

  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, не может ссылаться на проект U12 из-за круговой ссылки. Если он не может ссылаться на проект пользовательского интерфейса, компилятор не знает об IsAnythingDirty boolean.
  2. Проверка того, что Application.Current равно null, гарантирует, что код будет работать только на стороне клиента, а не на стороне сервера.
+0

Похоже, прагматическое решение для меня. Если вы самостоятельно разместили эту службу, будет ли Application.Current по-прежнему иметь значение null? –

3

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

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

+0

Это близко к тому, что я ищу, но потребует, чтобы код был помещен в тип, который отправляется по проводу (я использую «типы повторного использования в ссылочных сборках»). Если код находится в этом общем коде, он не имеет доступа к какой-либо информации в моем WPF/клиентском приложении. –

+0

Вы управляете кодом обслуживания, а также клиентом? Если да, вы можете поместить объекты передачи данных (и контракт) в свою собственную сборку и ссылаться на нее непосредственно на клиенте, а не на использование Добавить ссылку на службы в Visual Studio. Вы можете использовать это для генерации клиентской конфигурации (часто это склонно к ошибкам). но затем используйте ChannelFactory с типом контракта в ссылочной сборке. –

+0

Или если у вас нет доступа к служебному коду, вы можете использовать ссылку на службу для создания прокси-классов, а затем вставить код в свои собственные классы и добавить соответствующие методы для обработки событий десериализации. –

Смежные вопросы