1

我的服务中的课程定义为

[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 生成为抽象类?我被卡住了,请帮助...

4

1 回答 1

2

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

服务元数据只知道诸如服务、方法调用和数据契约之类的东西——其他任何东西都不属于服务元数据。

您将需要添加一些额外的逻辑并对客户端代码进行调整,一旦它被创建,如果这是您的实际需求。

马克

于 2009-04-28T05:27:33.253 回答