2009-04-28 57 views
1

我在服務類定義爲SvcUtil工具客戶端代理不產生抽象類(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; } 
} 

,並在我的服務,我用它作爲

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

正如你所看到的,TestAbstract方法接受並返回抽象參數MyAbstract,但是在由SvcUtil生成的客戶端代理中,類型「MyAbstract不是抽象的!它產生了一個具體的類。

[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; 
     } 
    } 
} 

如何強制svcUtil將MyAbstract作爲抽象類生成?我卡住了,請幫助...

回答

2

你不能--svcutil不能知道MyAbstract類是抽象的。服務器和客戶端之間交換的元數據不支持這樣的概念。 SOA世界並不總是支持OO世界存儲的所有東西。

服務元數據只知道諸如服務,方法調用和數據合約等事情 - 其他任何內容都不是服務元數據的一部分。

您將需要添加一些額外的邏輯和調整到客戶端代碼,一旦它創建,如果這是真正的需求在你身邊。

Marc

+0

我想它的DataContractSerializer不支持這一點。 XmlSerializer雖然。例如,如果您將svcutil指向使用抽象類的Web服務,則可以在客戶端上創建抽象類。在WCF服務上做到這一點,它現在不能再做了。 – user20155 2009-08-07 04:09:54