[英]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.