WCF DataContract: возвращение базового класса или унаследованного класса в зависимости от сценария - PullRequest
2 голосов
/ 19 марта 2012

Я разрабатываю службу WCF, предназначенную для использования клиентами, не являющимися клиентами .NET, которая выполняет операцию начисления платы.Я хотел бы иметь возможность возвращать базовый класс DataContract или унаследованный класс DataContract в зависимости от варианта использования.

Итак, у меня есть:

[DataContract]  
public class ChargeResponse  
{  
    [DataMember]  
    public string ID  

    [DataMember]  
    public string Description  
}  

Для успешных операций я хотел бы вернуть унаследованный тип, имеющий дополнительный DataMember, например:

[DataContract]  
public class SuccessfulChargeResponse : ChargeResponse  
{  
    [DataMember]  
    public string TransactionID  
}

Для всех остальныхя бы вернул класс баса.Это возможно?Или я просто должен иметь DataMember базовый класс и возвращать пустое значение.

Ответы [ 3 ]

3 голосов
/ 19 марта 2012

Да, это возможно.Пожалуйста, попробуйте рассмотреть ответ ниже. Ключ должен использовать атрибут KnownType () поверх вашего Контракта с данными.

Подробно: используйте атрибут [KnownType (typeof (SuccessfulChargeResponse))] поверх базового класса.Атрибут помогает механизму сериализации пометить SuccessfulChargeResponse как производный тип базового класса ChargeResponse.

Теперь, когда DataContract помечен его производными типами, ответ может иметь либо базовый тип, либо производный тип

Надеюсь, это поможет.Удачи:)

см. Ссылку для ссылки http://msdn.microsoft.com/en-us/library/ms730167.aspx

1 голос
/ 19 марта 2012

Вы слишком сложны - вам просто нужно вернуть ChargeResponse, который содержит TransactionID.Если операция прошла успешно, TransactionID будет иметь значение, а если не было, то TransactionID будет иметь значение null.Вы можете немного расширить свой класс, добавив флаг или перечисление, указывающее на успех, и любые свойства, которые вам нужны, чтобы указать, в чем заключалась ошибка.

Это называется шаблоном запрос / ответ и встречается довольно часто.Некоторые (возможно, очень неинтересные и не обязательно очень новые) ссылки, описывающие это:

1 голос
/ 19 марта 2012

Я так понимаю, это сервис на базе SOAP?Если это так, то правильный способ предупредить потребителей о неисправности или неуспешном состоянии, которое они обязаны обработать, - это раскрыть договор о неисправности в определении услуги.Затем вы можете просто вызвать исключение и заставить потребителя перехватить исключение, как если бы операция службы была внутрипроцессным методом.

Для этого используйте атрибут FaultContract в определении службы:

[OperationContract]
[FaultContract(typeof(MyChargeServiceExceptionType))]
ChargeResponse Charge(ChargeRequest request);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...