SvcUtil不在客户端代理(WCF)中生成抽象类

时间:2009-04-28 02:08:02

标签: wcf svcutil.exe

我的服务中的课程定义为

[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作为抽象类?我被困住了,请帮忙......

1 个答案:

答案 0 :(得分:2)

你不能 - svcutil不能知道MyAbstract类是抽象的。在服务器和客户端之间交换的元数据不支持这样的概念。 SOA世界并不总是支持OO世界的所有内容。

服务元数据只知道服务,方法调用和数据协定等内容 - 其他任何内容都不属于服务元数据。

一旦创建了客户端代码,您将需要添加一些额外的逻辑和调整,如果这是您的真正需求。

马克