簡體   English   中英

如何從服務中返回具有相同部分的各種類型?

[英]How to return various types from service but with the same part?

我從服務中退回各種類型的商品:

[ServiceContract]
public interface IService
{
    [OperationContract]
    void Initialize();

    [OperationContract]
    Settings GetSettings(); // returns custom type Settings

    [OperationContract]
    void SetSettings(Settings settings);

    [OperationContract]
    bool SettingsAccepted();
}

但是我想為我的服務引入狀態代碼,該代碼不是基於WCF基礎結構而是基於服務的內部邏輯構建的,如下所示:

[DataContract]
public enum ServiceStatus
{
    [EnumMember]
    NormalWork = 0,

    [EnumMember]
    TimeOut,

    [EnumMember]
    DenialOfService
};

而且我希望我的服務不僅返回void,bool或自定義類型,還返回帶有狀態代碼的偽代碼,如下所示(偽代碼):

[ServiceContract]
public interface IService
{
    [OperationContract]
    (ServiceStatus) Initialize();

    [OperationContract]
    (ServiceStatus, Settings) GetSettings();

    [OperationContract]
    (ServiceStatus) SetSettings(Settings settings);

    [OperationContract]
    (ServiceStatus, bool) SettingsAccepted();
}

客戶的邏輯將是這樣的:檢查返回消息中的狀態碼,如果它是ServiceStatus.NormalWork,則對返回消息的其余部分進行處理。

如何最好地組織它? 我是否已引入要返回的基類(具有DataContract屬性),然后根據每個返回值(每個操作協定)從中創建新的派生類? 還是有更好的方法? 也許WCF中有一個內置的基礎結構來執行這樣的任務-返回自定義狀態代碼和自定義返回類型?

您可以嘗試創建一個名為ServiceResponse<T>並使用屬性來擁有狀態和類型T屬性,這些屬性將是真正的返回對象。

當然,在這種方法中,當結果為bool類型時,您的所有方法都將返回ServiceResponse<bool>

它可能看起來像這樣:

[DataContract]
public class ServiceResponse<T>
{
  [DataMember]
  ServiceStatus Status { get; set; }

  [DataMember]
  T Payload { get; set; }
}

此類還可以包含向用戶發送的消息,異常,錯誤以及任何對處理來自WCF的正確響應有用的信息。

那么在WCF中的用法將是:

[OperationContract]
    ServiceResponse<bool> SettingsAccepted();

客戶的邏輯將是這樣的:檢查返回消息中的狀態碼,如果它是ServiceStatus.NormalWork,則對返回消息的其余部分進行處理。

如果您確實想要這樣做,則另一個答案包含創建此類野獸的所有詳細信息。 但是 ,請不要這樣做。 如果您的服務無法正常運行,請引發異常。 它將自動轉換為故障。

返回代碼是1980年。我已經必須進行異常處理。 您的服務可能不可用,網絡可能已關閉或其他任何故障。 所以我已經有了異常處理,現在有了您建議的方法,我需要進行異常處理返回碼處理。 每個電話。 糟透了。 此外,人們可能更容易犯錯誤。 他們可能只是采用傳遞的值而忘記了檢查您的返回碼。 除例外,該錯誤永遠不會發生。

如果您希望服務失敗並顯示“ DenialOfService”錯誤,請創建一個DenialOfServiceException並拋出該DenialOfServiceException 不要使用返回碼。 這不是WCF報告錯誤的方法。


如果確實要有固定的結構,則可以使用其他答案的模板方法,也可以使用繼承:

[DataContract]
public class ServiceResponse
{
    [DataMember]
    public ServiceStatus Status { get; set; }
}

[DataContract]
public class SettingsAcceptedResponse : ServiceResponse
{
    [DataMember]
    public bool Result { get; set; }
}

[ServiceContract]
public interface IService
{
    // [...] 

    [OperationContract]
    ServiceResponse SetSettings(Settings settings);

    [OperationContract]
    SettingsAcceptedResponse SettingsAccepted();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM