Silverlight: Общие типы / объекты между двумя WCF - сервисами побыстрому.



Задача: между двумя сервисами передавать общий объект одного класса (типа) на стороне клиента.
Т.е. Silverlight получает кастомный объект из одного сервиса, обрабатывает его и передает в другой сервис/ы.

Чтоб сделать так, вынесите общий тип в общий проект.
Этот проект должен быт Silverlight class library.
Мне даже не пришлось выкидывать конфликтующие с полным .NET Framework сборки при добавлении референса на общий Silverlight проект в проект Web-сайта.
Видимо, это будет работать пока не испольуются какие-либо сложные типы, например List<ЧтоТо>.

Оказалось в WCF задача решается, как и в обычных Web-сервисах ASP.NET – через внешнюю сборку, на которую ссылаются оба проекта - и клиент и сервис.

Но есть еще проблема с INotifyPropertyChanged.
Нельзя создать общий проект / сборку содержащую класс, наследованный от INotifyPropertyChanged, потому что этот интерфейс определен в сборке System для Silverlight, но не для полного .NET Framework.

Вот такая ошибка получается при этом:
The type 'System.ComponentModel.INotifyPropertyChanged' is defined in an assembly that is not referenced. You must add a reference to assembly 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'.



Для INotifyPropertyChanged я испоьзую класс-посредник, который размещен только в проекте клиента Silverlight:
public class myMediator : INotifyPropertyChanged{
private MySharedClass mySharedClass;

    public String Name{
        get{ return mySharedClass.Name; }

        set{
            mySharedClass.Name = value;
            RaisePropertyChanged(“Name”);
        }
    }

        . . . . .

}

В таком решении я получаю действительно общие типы, а не общий код, как при подходах расшаривания логиги между Silverlight и полным .NET Framework.
Хотя общий код тоже бывает полезен, но пока до этого руки не дошли.
Теперь можно часто перегенерировать сервисы без заморочек и без внешних утилит командной строки для сложных случаев.

Есть и более детальный подход на это решение, кому интересно посмотрите это Sharing Entities between WCF and Silverlight (EN).

Комментарии

  1. Но есть еще проблема с INotifyPropertyChanged.Нельзя создать общий проект / сборку собержащую класс, наследованный от INotifyPropertyChanged, потому что INotifyPropertyChanged лежит в сборке System для Silverlight, а не для .NET Framework. Я добавлю в основной пост ее решение.

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

A4tech. Мышь не найдена. Пожалуйста, подсоедините мышь.

SVN: Пропали иконки TortoiseSVN.

Вывод в cmd или bat пустой строки.