2012-06-18 38 views
2

我完全不熟悉WCF。添加新實體時的WCF方法返回類型

我想聽聽你對設置在主機服務器上添加新內容的返回類型的服務方法的想法。

我需要讓客戶知道用戶的電子郵件地址是否已經存在,否則繼續。你喜歡布爾型還是異常(那麼無意的例外情況如何)?

事情是,未來可能會添加大量驗證條件,如果插入已成功完成,我還需要知道新生成的用戶標識。

謝謝

回答

3

您可以創建一個結果類,你從CreateSomething()方法返回,並拋出一個FaultException時出現了錯誤:

public AddMemberResult AddMember(Member member) 
{ 

    // check all input, create the member 

    if (allGood) 
    { 
     return new AddMemberResult { UserID = createdMember.ID }; 
    } 
    else 
    { 
     throw new FaultException<AddMemberError>(new AddMemberError(errors)); 
    } 
} 


class AddMemberResult 
{ 
    public int UserID { get; set; } 
} 

class AddMemberError 
{ 
    public AddMemberError(List<Error> errors) 
    { 
     Errors = errors; 
    } 

    List<Error> Errors { get; set; } 
} 

class Error 
{ 
    public int Code { get; set; } 
    public string Description { get; set; } 
} 

當然你也可以簡單地從AddMember()返回int,但使用一類作爲返回類型,您可以應用版本控制而不必更新所有客戶端。如果您要添加一個新的屬性,比如boolean IsActivated,那麼您也可以返回該屬性,只需在AddMemberResult類中爲該屬性創建一個屬性,而不會破壞現有客戶端。

+0

感謝您的非常詳細的答案CodeCaster – Marle1

1

我會去例外。

就像你說的那樣,你需要返回一個id,以便在調用成功時從服務返回正確的類型。

如果調用失敗,您需要知道錯誤信息。這是例外情況。他們可以包含大量的信息。

0

不要拋出異常,因爲它會導致通道陷入FAULT狀態,這意味着如果您使用會話,則必須重新創建到服務器的新連接。這會導致溝通效率低下。

我想創建一個數據合同,從繼承IExtensibleDataObject

例如,

[DataContract] 
    public class Result:IExtensibleDataObject 
    { 
     [DataMember] 
     public bool Created { get; set; } 

     [DataMember] 
     public Guid NewID { get; set; } 

    } 

對於未來的擴展,可以應用數據契約版本,這取決於你的場景類(模式驗證需要/不需要)。更多信息可用here

+0

正如我在http://stackoverflow.com/questions/5514470/when-to-use-wcf-fault-exception中讀到的,這是我的理解,使用FaultExceptions不會導致通道陷入故障狀態? – Marle1

+0

它會使通道變爲FAULT。您可以使用控制檯應用程序輕鬆測試它並拋出異常。接下來,嘗試重用該頻道。 –