SvcUtil не генерирует абстрактные классы в клиентском прокси (WCF) - PullRequest
1 голос
/ 28 апреля 2009

У меня есть классы в моем сервисе, определенные как

[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 Ответ

2 голосов
/ 28 апреля 2009

Вы не можете - svcutil не может знать, что класс MyAbstract является абстрактным. Метаданные, которыми обмениваются сервер и клиент, просто не поддерживают такую ​​концепцию. Мир SOA не всегда поддерживает все, что есть в мире OO.

Метаданные службы знают только о таких вещах, как службы, вызовы методов и контракты данных - все остальное не является частью метаданных службы.

Вам нужно будет добавить немного дополнительной логики и настройки в клиентский код, как только он будет создан, если это реальное требование с вашей стороны.

Марк

...