2010-08-08 8 views
7

Przekonwertowałem moją usługę sieci Web do usługi wcf, która ma kilka datacontr. Najlepszą praktyką jest wspomniane i wskazane, że Kontrasy danych powinny dziedziczyć z IExtensibleDataObject. Rozumiem, że w przypadku dodawania lub usuwania datamembers pomocne jest IExtensibleDataObject. Ale nie jestem w stanie uzyskać w jaki sposób klienci mają dostęp do usuniętych datamembers. Tu jest mój kodu:Użycie IExtensibleDataObject w klientach

[ServiceContract(Namespace = "http://mycompany.com/2010/08/")] 
public class MyWebService { 
    [OperationContract] 
    public Employee Add(Employee emp) 
    { 
     // Some Processing 
    } 
} 

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/08/")] 
public class Employee : IExtensibleDataObject { 
    [DataMember] public string FirstName; 
    [DataMember] public string LastName; 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

Teraz w kolejnej wersji usługi internetowej Zrobiłem kilka zmian do DataContract jako

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/09/")] 
public class Employee : IExtensibleDataObject { 
    [DataMember] public string FirstName; 
    [DataMember] public string LastName; 
    [DataMember(IsRequired = true)] public string MiddleName; 

    public ExtensionDataObject ExtensionData { get; set; } 
} 

Jednak mój klient, który uzyskuje dostęp do mojej starszej wersji usługi internetowej jest teraz coraz błędu za brak podania pola MiddleName. Nadal jestem zdezorientowany z powodu użycia IExtensionDataObject.

Odpowiedz

12

Obawiam się, że nie jest to prawidłowe wykorzystanie IExtensibleDataObject interfejs IExtensibleDataObject jest przeznaczony do obsługi wersja round-potknięcia, mają czytać tego artykułu MSDN na kompatybilność w przód:

http://msdn.microsoft.com/en-us/library/ms731083.aspx

A oto kolejny artykuł na temat najlepszych praktyk w zakresie danych wersjonowanie Kontraktu ogólnie: http://msdn.microsoft.com/en-us/library/ms733832.aspx

+1

Co jest nie tak? .NET generuje automatycznie pole pomocnicze - a dokumentacja Microsoft nie wyjaśnia, dlaczego musi być wirtualna i dlaczego wymaga ręcznie określonego pola wsparcia. – ShadowChaser

11

Nieprawidłowe użycie obiektu IExtensibleDataObject. Zmodyfikowałeś kontrakt danych po stronie serwera i zaznaczyłeś nowe pole zgodnie z wymaganiami, więc oznacza to, że masz zepsutą wersję i nic ci nie pomoże.

Obiekt IExtensibleDataObject służy do innych celów. Załóżmy, że zmodyfikowałeś klienta, aby umowa danych na kliencie zawierała MiddleName. Teraz ustawiasz MiddleName i używasz Add service operation. Jaka wartość MiddleName będzie w zwróconym obiekcie Employee? Jeśli nie użyjesz IExtensibleDataObject, wartość będzie równa null, jeśli użyjesz IExtensibleDataObject, wartość będzie taka sama jak ustawiłeś na parametr wejściowy.

Podczas korzystania z DataContractSerializer WCF wyrzuca wszystkie nierozpoznane parametry. IExtensibleDataObject unika tego przez przechowywanie wszystkich tych parametrów w specjalnym zbiorze i wysyłanie ich z powrotem do klienta.

Jeśli chcesz używać wersji kontraktowej, zapomnij o wymaganych polach. To pierwsza rzecz, która go przełamie.

poważaniem, Ladislav

0

Wykonaj właściwość ExtensionData "Virtual", jak pokazano poniżej:

public virtual ExtensionDataObject ExtensionData 
{ 
    get { return theData; } 
    set { theData = value; } 
}