Kesin olarak yazılan uzantılar örneği

StronglyTypedExtensions örneği, örneğin amaçları için sınıfını kullanırSyndicationFeed. Ancak, bu örnekte belirtilen desenler uzantı verilerini destekleyen tüm Dağıtım sınıfları ile kullanılabilir.

Dağıtım nesne modeli (SyndicationFeed, SyndicationItemve ilgili sınıflar), ve ElementExtensions özelliklerini kullanarak AttributeExtensions uzantı verilerine gevşek türlenmiş erişimi destekler. Bu örnek, özel türetilmiş sınıfları SyndicationFeed uygulayarak ve SyndicationItem belirli uygulamalara özgü uzantıları kesin olarak belirlenmiş özellikler olarak kullanılabilir hale getirerek uzantı verilerine kesin olarak türetilmiş erişim sağlamayı gösterir.

Örnek olarak, bu örnekte önerilen Atom İş Parçacığı Uzantıları RFC'sinde tanımlanan bir uzantı öğesinin nasıl uygulandığı gösterilmektedir. Bu yalnızca tanıtım amaçlıdır ve bu örnek önerilen belirtimin tam bir uygulaması olarak tasarlanmamıştır.

Örnek XML

Aşağıdaki XML örneğinde ek <in-reply-to> uzantı öğesi içeren bir Atom 1.0 girişi gösterilmektedir.

<entry>
    <id>tag:example.org,2005:1,2</id>
    <title type="text">Another response to the original</title>
    <summary type="text">
         This is a response to the original entry</summary>
    <updated>2006-03-01T12:12:13Z</updated>
    <link href="http://www.example.org/entries/1/2" />
    <in-reply-to p3:ref="tag:example.org,2005:1"
                 p3:href="http://www.example.org/entries/1"
                 p3:type="application/xhtml+xml"
                 xmlns:p3="http://contoso.org/syndication/thread/1.0"
                 xmlns="http://contoso.org/syndication/thread/1.0">
      <anotherElement xmlns="http://www.w3.org/2005/Atom">
                     Some more data</anotherElement>
      <aDifferentElement xmlns="http://www.w3.org/2005/Atom">
                     Even more data</aDifferentElement>
    </in-reply-to>
</entry>

<in-reply-to> öğesi, ek uzantı özniteliklerinin ve hrefuzantı öğelerinin varlığına izin verirken üç gerekli özniteliği (reftypeve ) belirtir.

Yanıtla öğesini modelleme

Bu örnekte<in-reply-to>, öğesi ile DataContractSerializerkullanılmasını sağlayan öğesini uygulayan IXmlSerializableCLR olarak modellenmiştir. Ayrıca, aşağıdaki örnek kodda gösterildiği gibi öğenin verilerine erişmek için bazı yöntemler ve özellikler uygular.

[XmlRoot(ElementName = "in-reply-to", Namespace = "http://contoso.org/syndication/thread/1.0")]
public class InReplyToElement : IXmlSerializable
{
    internal const string ElementName = "in-reply-to";
    internal const string NsUri =
                  "http://contoso.org/syndication/thread/1.0";
    private Dictionary<XmlQualifiedName, string> extensionAttributes;
    private Collection<XElement> extensionElements;

    public InReplyToElement()
    {
        this.extensionElements = new Collection<XElement>();
        this.extensionAttributes = new Dictionary<XmlQualifiedName,
                                                          string>();
    }

    public Dictionary<XmlQualifiedName, string> AttributeExtensions
    {
        get { return this.extensionAttributes; }
    }

    public Collection<XElement> ElementExtensions
    {
        get { return this.extensionElements; }
    }

    public Uri Href
    { get; set; }

    public string MediaType
    { get; set; }

    public string Ref
    { get; set; }

    public Uri Source
    { get; set; }
}

sınıfı, InReplyToElement gerekli öznitelik (HRef, MediaTypeve ) için özelliklerin Sourceyanı sıra ve ElementExtensions'yi barındıracak AttributeExtensions koleksiyonlar uygular.

InReplyToElement sınıfı, nesne örneklerinin IXmlSerializable XML'den nasıl okunduğu ve XML'ye nasıl yazıldığı üzerinde doğrudan denetim sağlayan arabirimini uygular. ReadXml yöntemi ilk olarak , , HRefSourceve MediaType özellikleri için Refgeçirilen değerinden XmlReader değerleri okur. Bilinmeyen öznitelikler koleksiyonda AttributeExtensions depolanır. Tüm öznitelikler okunduğunda, ReadStartElement() okuyucuyu sonraki öğeye ilerletmek için çağrılır. Bu sınıf tarafından modellenen öğenin gerekli alt öğeleri olmadığından, alt öğeler aşağıdaki kodda gösterildiği gibi örneklere XElement arabelleğe alınır ve koleksiyonda ElementExtensions depolanır.

public void ReadXml(System.Xml.XmlReader reader)
{
    bool isEmpty = reader.IsEmptyElement;

    if (reader.HasAttributes)
    {
        for (int i = 0; i < reader.AttributeCount; i++)
        {
            reader.MoveToNextAttribute();

            if (reader.NamespaceURI == "")
            {
                if (reader.LocalName == "ref")
                {
                    this.Ref = reader.Value;
                }
                else if (reader.LocalName == "href")
                {
                    this.Href = new Uri(reader.Value);
                }
                else if (reader.LocalName == "source")
                {
                    this.Source = new Uri(reader.Value);
                }
                else if (reader.LocalName == "type")
                {
                    this.MediaType = reader.Value;
                }
                else
                {
                    this.AttributeExtensions.Add(new
                                 XmlQualifiedName(reader.LocalName,
                                 reader.NamespaceURI),
                                 reader.Value);
                }
            }
        }
    }

    reader.ReadStartElement();

    if (!isEmpty)
    {
        while (reader.IsStartElement())
        {
            ElementExtensions.Add(
                  (XElement) XElement.ReadFrom(reader));
        }
        reader.ReadEndElement();
    }
}

içinde WriteXmlInReplyToElement yöntemi önce , , HRefSourceve MediaType özelliklerinin değerlerini XML öznitelikleri Refolarak yazar (WriteXml öğesini çağıranın yaptığı gibi gerçek dış öğenin kendisini yazmaktan WriteXmlsorumlu değildir). Ayrıca, aşağıdaki kodda gösterildiği gibi ve ElementExtensions içeriğini AttributeExtensions yazara yazar.

public void WriteXml(System.Xml.XmlWriter writer)
{
    if (this.Ref != null)
    {
        writer.WriteAttributeString("ref", InReplyToElement.NsUri,
                                            this.Ref);
    }
    if (this.Href != null)
    {
        writer.WriteAttributeString("href", InReplyToElement.NsUri,
                                                this.Href.ToString());
    }
    if (this.Source != null)
    {
        writer.WriteAttributeString("source", InReplyToElement.NsUri,
                                              this.Source.ToString());
    }
    if (this.MediaType != null)
    {
        writer.WriteAttributeString("type", InReplyToElement.NsUri,
                                                    this.MediaType);
    }

    foreach (KeyValuePair<XmlQualifiedName, string> kvp in
                                             this.AttributeExtensions)
    {
        writer.WriteAttributeString(kvp.Key.Name, kvp.Key.Namespace,
                                                   kvp.Value);
    }

    foreach (XElement element in this.ElementExtensions)
    {
        element.WriteTo(writer);
    }
}

ThreadedFeed ve ThreadedItem

Örnekte uzantılar SyndicationItemsInReplyTo sınıfı tarafından ThreadedItem modellenmiştir. Benzer şekilde, sınıfı öğelerinin ThreadedFeed tümü örneği olan bir SyndicationFeed sınıfıdır ThreadedItem.

ThreadedFeed sınıfı öğesinden SyndicationFeed devralır ve bir ThreadedItemdöndürmek için geçersiz kılarOnCreateItem. Ayrıca, aşağıdaki kodda gösterildiği gibi koleksiyonuna Items olarak ThreadedItemserişmek için bir yöntem uygular.

public class ThreadedFeed : SyndicationFeed
{
    public ThreadedFeed()
    {
    }

    public IEnumerable<ThreadedItem> ThreadedItems
    {
        get
        {
            return this.Items.Cast<ThreadedItem>();
        }
    }

    protected override SyndicationItem CreateItem()
    {
        return new ThreadedItem();
    }
}

sınıfı ThreadedItem öğesinden SyndicationItem devralır ve kesin olarak türü belirlenmiş bir özellik olarak yapar InReplyToElement . Bu, uzantı verilerine InReplyTo program aracılığıyla kolay erişim sağlar. Ayrıca, aşağıdaki kodda gösterildiği gibi uzantı verilerini okumak ve yazmak için ve uygular TryParseElementWriteElementExtensions .

public class ThreadedItem : SyndicationItem
{
    private InReplyToElement inReplyTo;
    // Constructors
        public ThreadedItem()
        {
            inReplyTo = new InReplyToElement();
        }

        public ThreadedItem(string title, string content, Uri itemAlternateLink, string id, DateTimeOffset lastUpdatedTime) : base(title, content, itemAlternateLink, id, lastUpdatedTime)
        {
            inReplyTo = new InReplyToElement();
        }

    public InReplyToElement InReplyTo
    {
        get { return this.inReplyTo; }
    }

    protected override bool TryParseElement(
                        System.Xml.XmlReader reader,
                        string version)
    {
        if (version == SyndicationVersions.Atom10 &&
            reader.NamespaceURI == InReplyToElement.NsUri &&
            reader.LocalName == InReplyToElement.ElementName)
        {
            this.inReplyTo = new InReplyToElement();

            this.InReplyTo.ReadXml(reader);

            return true;
        }
        else
        {
            return base.TryParseElement(reader, version);
        }
    }

    protected override void WriteElementExtensions(XmlWriter writer,
                                                 string version)
    {
        if (this.InReplyTo != null &&
                     version == SyndicationVersions.Atom10)
        {
            writer.WriteStartElement(InReplyToElement.ElementName,
                                           InReplyToElement.NsUri);
            this.InReplyTo.WriteXml(writer);
            writer.WriteEndElement();
        }

        base.WriteElementExtensions(writer, version);
    }
}

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  3. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.