2009-04-28 7 views
1

Ich habe Klassen in meinem Dienst definiert alsSvcUtil nicht abstrakte Klassen in der Client-Proxy-Generierung (WCF)

[DataContract] 
[KnownType(typeof(MyConcrete1)) ] 
[KnownType(typeof(MyConcrete2)) ] 
public abstract class MyAbstract 
{ 
    [DataMember] 
    public int AbsInt { get; set; } 
} 
[DataContract] 
public class MyConcrete1 : MyAbstract 
{ 
    [DataMember] 
    public int Concrete1Int { get; set; } 
} 
[DataContract] 
public class MyConcrete2 : MyAbstract 
{ 
    [DataMember] 
    public int Concrete2Int { get; set; } 
} 

und in meinem Dienst, verwende ich es als

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    MyAbstract TestAbstract(MyAbstract value); 
} 

Wie Sie sehen können , die Methode TestAbstract übernimmt und gibt den abstrakten Parameter MyAbstract zurück, jedoch ist der Typ "MyAbstract" in dem Client-Proxy, der von SvcUtil generiert wird, nicht abstrakt! Es erzeugte eine konkrete Klasse.

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name = "MyAbstract", Namespace = "http://schemas.datacontract.org/2004/07/WcfService")] 
[System.Runtime.Serialization.KnownTypeAttribute(typeof(WcfService.MyConcrete1))] 
[System.Runtime.Serialization.KnownTypeAttribute(typeof(WcfService.MyConcrete2))] 
public partial class MyAbstract : object, System.Runtime.Serialization.IExtensibleDataObject 
{ 

    private System.Runtime.Serialization.ExtensionDataObject extensionDataField; 

    private int AbsIntField; 

    public System.Runtime.Serialization.ExtensionDataObject ExtensionData 
    { 
     get 
     { 
      return this.extensionDataField; 
     } 
     set 
     { 
      this.extensionDataField = value; 
     } 
    } 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public int AbsInt 
    { 
     get 
     { 
      return this.AbsIntField; 
     } 
     set 
     { 
      this.AbsIntField = value; 
     } 
    } 
} 

Wie kann ich SvcUtil zwingen MyAbstract als abstrakte Klasse zu generieren? Ich bin stecken, bitte helfen ...

Antwort

2

Sie können nicht - Svcutil kann nicht wissen, dass MyAbstract-Klasse abstrakt ist. Die Metadaten, die zwischen Server und Client ausgetauscht werden, unterstützen ein solches Konzept nicht. Die SOA-Welt unterstützt nicht immer alles, was die OO-Welt bereithält.

Die Service-Metadaten kennen nur Dinge wie Dienste, Methodenaufrufe und Datenverträge - alles andere ist nicht Teil der Service-Metadaten.

Sie müssen dem Client-Code nach der Erstellung zusätzliche Logik und Optimierungen hinzufügen, wenn dies eine echte Anforderung an Ihrer Seite ist.

Marc

+0

Ich nehme an, es ist der DataContractSerializer, der dies nicht unterstützt. XmlSerializer tut dies aber. Wenn Sie beispielsweise svcutil auf einen Webdienst richten, der abstrakte Klassen verwendet, kann er die abstrakten Klassen auf dem Client erstellen. Tun Sie es auf einem WCF-Dienst und es kann nicht mehr. – user20155