Расширяемость синдикации
API синдикации предназначен для обеспечения независимой от формата модели программирования, которая позволяет передавать сводный контент по каналам связи в различных форматах. Абстрактная модель данных состоит из следующих классов:
Эти классы тесно сопоставлены с конструкциями, определенными в спецификации Atom 1.0, хотя некоторые имена различаются.
Ключевой особенностью протоколов синдикации является их расширяемость. Оба протокола, Atom 1.0 и RSS 2.0, добавляют в RSS-каналы атрибуты и элементы, не определенные в спецификациях. Модель программирования синдикации Windows Communication Foundation (WCF) обеспечивает следующие способы работы с пользовательскими атрибутами и расширениями, использования слабо типизированного доступа и создания новых производных классов.
Слабо типизированный доступ
Чтобы добавить расширения путем создания нового производного класса, требуется написать дополнительный код. Другим вариантом является слабо типизированный доступ к расширениям. Все типы, определенные в абстрактной модели данных синдикации, содержат свойства AttributeExtensions и ElementExtensions (с одним исключением — SyndicationContent имеет свойство AttributeExtensions, но не имеет свойства ElementExtensions). Эти свойства представляют собой коллекции расширений, не обрабатываемых методами TryParseAttribute и TryParseElement соответственно. Доступ к этим необработанным расширениям можно получить, вызвав метод System.ServiceModel.Syndication.SyndicationElementExtensionCollection.ReadElementExtensions.String,System.String) для свойства ElementExtensions классов SyndicationFeed, SyndicationItem, SyndicationLink, SyndicationPerson и SyndicationCategory. Этот набор методов находит все расширения с указанными именем и пространством имен, индивидуально десериализует их в экземпляры TExtension и возвращает в виде коллекции объектов TExtension.
Создание нового производного класса
Новый производный класс можно создать на основе любого существующего класса абстрактной модели данных. Используйте это при реализации приложения, в котором большинство веб-каналов, с которыми вы работаете, имеют определенное расширение. В данном разделе большинство веб-каналов, с которыми работает программа, содержат расширение MyExtension. Для упрощения программирования выполните следующие шаги:
Создайте класс, который будет содержать данные приложения. В данном случае создайте класс с именем MyExtension.
Создайте класс MyExtensionItem, наследующий от класса SyndicationItem, чтобы сделать доступным для программирования свойство типа MyExtension.
Переопределите метод TryParseElement класса MyExtensionItem, чтобы при считывании MyExtension присваивать значение новому экземпляру MyExtension.
Переопределите метод WriteElementExtensions класса MyExtensionItem, чтобы записывать содержимое свойства MyExtension в средство записи XML.
Создайте класс MyExtensionFeed, наследующий от класса SyndicationFeed.
Переопределите метод CreateItem класса MyExtensionFeed, чтобы он присваивал значение MyExtensionItem, а не значение по умолчанию SyndicationItem. В классах SyndicationFeed и SyndicationItem определен ряд методов, которые могут создавать объекты SyndicationLink, SyndicationCategory и SyndicationPerson (например, CreateLink, CreateCategory и CreatePerson). Любой из этих методов может быть переопределен для создания пользовательского производного класса.