2013-03-08 7 views
6

Ich bin DataGrid.ItemsSource Eigenschaft an die List<PersonDetails> Objekt gebunden. Ich erhalte Daten über Silverlight-aktiviertem WCF-Dienst. Daher ist die Klasse PersonDetails in Web Project implementiert. Der Header-Text jedes DataGrids ändert sich wie gewünscht, wenn sich die Klasse im Silverlight-Projekt befindet. Aber dann kann ich diese Klasse nicht im Webservice verwenden. Die einzige Lösung besteht darin, den beiden Projekten dieselbe Klasse hinzuzufügen. Aber gibt es einen anderen Weg?DisplayAttribute Name Eigenschaft funktioniert nicht in Silverlight

Die Klasse sieht wie folgt aus:

[DataContract] 
public class PersonGeneralDetails 
{ 
    // Properties 

    [DataMember] 
    [DisplayAttribute(Name = "Sira")] 
    public int RowNumber { get; set; } 

    [DataMember] 
    [DisplayAttribute(Name = "Seriyasi")] 
    public string SerialNumber { get; set; } 
} 

Es scheint Attribute nicht in Web-Projekt erzeugt. Ich weiß, dass ich Header-Text mit DataGrid-Ereignissen ändern kann. Aber ich möchte es mit Attributen arbeiten lassen.

Antwort

3

Das Problem ist der WCF DataContract ist ein interoperabler Mechanismus, der über Sprachen und Plattformen hinweg verwendet werden kann.

Wenn Sie einen Blick auf serialisierten Daten übernehmen, die durch die DataContractSerializer (oder seinen Code in System.Runtime.Serialization.dll, speziell InternalWriteObjectXyz() Methoden) Sie werden sehen, dass es nur Werte in eine einfache XML-Nachricht serialisiert. Nichts, was mit .NET Framework zu tun hat, wird vorhanden sein, so dass alle Arten von Attributen, sowohl benutzerdefinierte als auch generierte Compiler, entfernt werden und nicht einmal vom Client empfangen werden.

Es funktioniert eine Kopie Ihrer Daten erstellen und sie vom Server an den Client gesendet wird, werden die Kunden dann eine neue Klasse mit der gleichen Signatur erstellen. Hinweis: a NEW CLASS mit der gleichen Signatur, NICHT NUR EIN NEUES OBJEKT der ursprünglichen Klasse.

Natürlich gibt es einige Abhilfe dafür. Sie können Ihren eigenen Serializer (siehe this post on SO für ein Beispiel) oder Ihr eigenes ISerializationSurrogate schreiben.

Wenn Sie deploy/Ihre Baugruppen Ihren Kunden teilen haben Sie eine schöne Abhilfe: nur sie implementieren und DataContractSerializer wird das richtige Objekt auf Ihre Kunden (genau das gleiche auf dem Server hatte, mit all ihren bauen Attribute). Denken Sie daran, dass:

  • Wenn benutzerdefinierte kommt von Laufzeitwerten Attribute (zum Beispiel wegen der Lokalisierung), dann werden sie auf dem Client aufgelöst werden, nicht auf dem Server (weil Attribute werden erstellt auf die Client, ihre Werte werden nicht in der XML-Nachricht enthalten sein).
  • In der Client-Anwendung müssen Sie einen Verweis auf die Assembly hinzufügen, die Ihre Typen enthält.
  • Wenn Sie Ihren Dienstverweis hinzufügen müssen Sie anweisen, VS, sie zu benutzen (oder es wird Proxies erstellen) diese in referenzierten Assemblys (Sie können nur Baugruppen in den Service-Referenz Einstellungen Dialog wählen Reuse Typen begrenzen Sie möchten teilen).
+0

Danke. Wirklich gute Erklärung. –

+0

Auch ich habe noch eine Frage. Ich habe über Lösungen nachgedacht, die Sie mir angeboten haben.Ich stieß auf das Hinzufügen von Klassen als Link. Bedeutet das Bereitstellen/Freigeben von Assemblys? –

+0

@FarhadJabiyev RIA Dienstleistungen? Ich weiß nicht, ob sie Attribute "behalten" oder nicht, lass es mich wissen, wenn es funktioniert! –