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 href
uzantı öğelerinin varlığına izin verirken üç gerekli özniteliği (ref
type
ve ) 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
, MediaType
ve ) için özelliklerin Source
yanı 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 , , HRef
Source
ve MediaType
özellikleri için Ref
geç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 WriteXml
InReplyToElement
yöntemi önce , , HRef
Source
ve MediaType
özelliklerinin değerlerini XML öznitelikleri Ref
olarak yazar (WriteXml
öğesini çağıranın yaptığı gibi gerçek dış öğenin kendisini yazmaktan WriteXml
sorumlu 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 SyndicationItems
InReplyTo
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 ThreadedItem
döndürmek için geçersiz kılarOnCreateItem
. Ayrıca, aşağıdaki kodda gösterildiği gibi koleksiyonuna Items
olarak ThreadedItems
eriş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 TryParseElement
WriteElementExtensions
.
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çin Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.
Çö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.
Ö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.