Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
StronglyTypedExtensions örneği, SyndicationFeed sınıfını örnek amacıyla kullanır. 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, SyndicationItem ve ilgili sınıflar), AttributeExtensions ve ElementExtensions özelliklerini kullanarak uzantı verilerine gevşek türlenmiş erişimi destekler. Bu örnek, SyndicationFeed ve SyndicationItem özel türetilmiş sınıflarını uygulayarak ve belirli uygulamalara özgü uzantıları kesin tipli özellikler olarak kullanılabilir hale getirerek uzantı verilerine kesin tipli 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, üç gerekli öznitelik (ref, type ve href) belirtir ve ek uzantı öznitelikleri ile uzantı öğelerinin varlığına izin verir.
in-Reply-To öğesini modelleme
Bu örnekte, <in-reply-to> elementi, IXmlSerializable öğesini uygulayan CLR olarak modellenmiştir, bu da onun DataContractSerializer ile kullanılmasını sağlar. 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; }
}
InReplyToElement sınıfı, gerekli öznitelik için özellikleri (HRef, MediaType, ve Source) ve AttributeExtensions ile ElementExtensions'yi barındıracak 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, kendisine geçirilen Ref'den ilk olarak HRef, Source, MediaType ve XmlReader özelliklerine ait 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 XElement örnekleri olarak arabelleğe alınır ve ElementExtensions koleksiyonu içinde 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();
}
}
WriteXml içinde, InReplyToElement yöntemi önce Ref, HRef, Source ve MediaType özelliklerinin değerlerini XML öznitelikleri olarak yazar (WriteXml, gerçek dış öğenin kendisini yazmaktan sorumlu değildir, bu iş WriteXml öğesini çağıran tarafından yapılır).
AttributeExtensions ve ElementExtensions içeriklerini de aşağıdaki kodda gösterildiği gibi 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, SyndicationItems uzantıları InReplyTo sınıfı tarafından ThreadedItem ile modellenmiştir. Benzer şekilde, ThreadedFeed sınıfı, öğelerinin tümü SyndicationFeed örneği olan bir ThreadedItem sınıfıdır.
ThreadedFeed sınıfı, SyndicationFeed sınıfından türetilir ve OnCreateItem metodunu geçersiz kılarak bir ThreadedItem döndürür. Ayrıca, aşağıdaki kodda gösterildiği gibi Items koleksiyonuna ThreadedItems olarak erişmek için bir yöntem de uygular.
public class ThreadedFeed : SyndicationFeed
{
public ThreadedFeed()
{
}
public IEnumerable<ThreadedItem> ThreadedItems
{
get
{
return this.Items.Cast<ThreadedItem>();
}
}
protected override SyndicationItem CreateItem()
{
return new ThreadedItem();
}
}
ThreadedItem sınıfı, SyndicationItem sınıfından devralır ve InReplyToElement öğesini kesin olarak türü belirlenmiş bir özellik olarak tanımlar. Bu, uzantı verilerine InReplyTo program aracılığıyla kolay erişim sağlar. Ayrıca, uzantı verilerini okumak ve yazmak için TryParseElement ve WriteElementExtensions uygular, aşağıdaki kodda gösterildiği gibi.
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
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.
Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.