2012-12-17 47 views
0

我需要返回Employee類作爲對clientA的響應,如下所示。如何使用單個WCF服務支持不同的客戶端

[OperationContract] 

    public Employee GetEmployee(String id) 
    { 
    .. 
    .. 
    return emp; 
    } 

    public class Employee 
    { 
    public string Name; 
    public string phoneNo; 
    } 

但這裏的問題是clientB是要消耗我的服務,但需要員工的SSN。如果我將它添加到Employee類中,我將發送到clientA以及哪些不需要它。如何克服這種情況。如果我必須對自定義反序列化做任何事情,如果我要處理1000個屬性,這不是問題嗎?

哪個更好的解決方案?任何wcf架構的幫助也會更有幫助。

回答

1

如果不同的客戶有不同的需求,正確的做法是創建不同的服務。

您將業務邏輯放入共享業務類(或分佈在多個共享業務類中),並針對不同類型的客戶端公開不同的服務。這使得事情變得更好,抽象和安全,沒有人獲取他們不需要或不需要的數據。

+0

你的意思是說,我必須爲每個服務合同創建兩個不同的員工類別? –

+0

是的。您儘可能嚴格地制定合同:只需要實際需要的參數,並且只返回實際需要的數據。這是一個更多的工作,但最終的結果是更清晰和更安全。 –

0

我是第二個Roy,但是如果這是客戶端A和B之間的唯一區別。使用參數IsSSNRequired公開一個可以具有默認假值的GetEmployee方法並不會傷害。

+0

當開發進展的時候,我可能會遇到很多變化。所以這不會是唯一的不同 –

+0

我想說的是從單一服務開始,當你認爲你正在做一些安靜的工作時 - 重構多種服務方式。這只是一個建議。根據偏差的數量和規模,您將成爲判斷您想如何做的最佳人選。 – humblelistener

1

關於此link已經有一個非常類似的討論。基本上,它是指有條件地隱藏數據成員的值。

您可以根據客戶端ID或憑據(應將其作爲參數傳遞給服務方法調用)來決定是否要公開數據成員。

[OperationContract] 
public Employee GetEmployee(int clientId, String id) 
{ 
    var employee = new Employee(); 

    //here you might use a mapping table between the clients and the exposed data members 
    if (clientId == 1) 
    { 
     employee.IsSSNSerializable = true; 
    } 
    return employee; 
} 

Employee類將暴露基礎上,IsSSNSerializable屬性值的SSN

[DataContract] 
public class Employee 
{ 
    public bool IsSSNSerializable = false; 

    [DataMember] 
    public string Name; 
    [DataMember] 
    public string phoneNo; 

    public string SSN; 

    [DataMember(Name = "SSN", EmitDefaultValue = false)] 
    public string SSNSerializable 
    { 
     get 
     { 
      if (!IsSSNSerializable) 
       return null; 
      return SSN; 
     } 
     set 
     { 
      SSN = value; 
     } 
    } 
} 
1

我建議你把versioning strategies of the WCF,可能是與你的情況下比賽的一讀。

對於我的情況,我在數據合同上實現了IExtensibleDataObject,並在這一層管理而不是服務合同層。

不利的一面是很難跟蹤不同版本的合同,但是我正在練習半嚴格的版本控制並且適合我。

相關問題