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).
Но есть еще проблема с INotifyPropertyChanged.Нельзя создать общий проект / сборку собержащую класс, наследованный от INotifyPropertyChanged, потому что INotifyPropertyChanged лежит в сборке System для Silverlight, а не для .NET Framework. Я добавлю в основной пост ее решение.
ОтветитьУдалить