Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

понедельник, 30 ноября 2009 г.

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 комментарий:

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

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