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