2010-12-27 5 views
0
  1. Ich implementiere diese Schnittstelle nicht in DC am Server.IExtensibleDataObject erreicht Vorwärts- und Rückwärtskompatibilität

  2. Obwohl ich diese Implementierung von VS2008 bei Client automatisch generiert bekommen, was in Ordnung ist.

  3. Jetzt gehe ich und meine Reference.cs bearbeiten ein neues Feld umfassen (Differenzierung des Server DC (Inputparameter) der jeweiligen Service-Methode)

  4. Compile, den Code ausführen Hinweis auf alten Dienst, es funktioniert gerade gut, obwohl ich den Wert des neuen Feldes (Beispiel boolescher Typ auf wahr) setze, meinen Wert ignorierend.

  5. Warum sollte für die DC

  6. ich erwarte Vorwärts-Kompatibilität auf dem Server implementieren und es funktioniert gut.

  7. Jetzt entferne ich den Code nur ich in # 3 hinzugefügt. Kompilieren.

  8. Stattdessen das gleiche Feld in der Server-DC-Kompilierung hinzugefügt.

  9. Jetzt führe ich den Code senden weniger Daten vom Client zu einem Server DC hat mehr Spalten. Es funktioniert einfach gut. was bedeutet, dass die Abwärtskompatibilität gut funktioniert?

  10. Hoffe einige, wo mein Verständnis nicht korrekt ist?

Meine Umgebung ist .NET 3.5 Sp1

Antwort

1

IExtensibleDataObject für verschiedene Zwecke ist. Angenommen, Sie haben einen Vorgang wie:

[DataContract] 
public class MyObject 
{ 
    [DataMember] 
    public string MyMember { get; set; } 
} 

[ServiceContract] 
public class MyService 
{ 
    [OperationContract] 
    public MyObject Operation(MyObject object) 
    { 
    object.MyMember += " modified"; 
    return object; 
    } 
} 

Erwartetes Verhalten ist, dass Operation geänderte Parameter zurückgibt.

Nehmen wir nun an, dass Sie Datenvertrag auf dem Client ändern:

[DataContract] 
public class MyObject 
{ 
    [DataMember] 
    public string MyMember { get; set; } 
    [DataMember] 
    public string MyNewMember { get; set; } 
} 

lässt nun die Operation nennen:

var client = new MyServiceClient(); 
var myObject = new MyObject 
    { 
    MyMember = "Member", 
    MyNewMember = "Some value" 
    }; 

MyObject returnedObject = client.Operation(myObject); 

Die Datenvertrag Dienst nicht IExtensibleDataObject implementieren und es weiß nicht, über MyNewMember-Eigenschaft. Welcher Wert wird in returnObject.MyNewMember sein? Es wird null sein. Aber wenn Sie IExtensibleDataObject auf der Serverseite implementieren, wird es "Einiger Wert" sein, selbst der Server weiß nichts über diese Eigenschaft.

+0

Wie das hilft, meine Vorwärts- und/oder Rückwärtskompatibilität zu erreichen, ist meine Frage? siehe http://bloggingabout.net/blogs/vagif/archive/2009/03/29/iextensibledataobject-is-not-only-for-backward-compatibility.aspx http://stackoverflow.com/questions/3434045 – sahridhayan

+0

Basierend auf meiner Antwort und den von Ihnen bereitgestellten Links sollten Sie bereits wissen, wann Sie IExtensibleDataObject implementieren müssen. Wenn Ihr Servicevertrag keine Operation mit Datenumlauf enthält, benötigen Sie IExtensibleDataObject nicht. –

Verwandte Themen