[英]How to support different clients with single WCF service
我需要返回Employee類,作為對我的clientA的響應,如下所示。
[OperationContract]
public Employee GetEmployee(String id)
{
..
..
return emp;
}
public class Employee
{
public string Name;
public string phoneNo;
}
但是這里的問題是clientB將消耗我的服務,但是需要員工的SSN。 如果我將其添加到Employee類中,我也將發送給clientA,而這將不需要它。 如何克服這種情況。 如果我必須對自定義反序列化進行任何操作,如果我要處理1000多個屬性,這不是問題嗎?
哪個是更好的解決方案? 任何wcf架構幫助也將更有幫助。
如果不同的客戶有不同的需求,那么正確的做法就是創建不同的服務。
您將業務邏輯放入共享的業務類中(或分布在多個共享的業務類中),並針對不同類型的客戶端公開不同的服務。 這樣可以使一切保持良好,抽象和安全的狀態,並且沒有人獲得不需要或不需要的數據。
在此鏈接上有非常相似的討論。 基本上,它指的是有條件地隱藏數據成員的值。
您可以根據客戶端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;
}
}
}
我建議您閱讀WCF的版本控制策略,該策略可能與您的方案相匹配。
就我而言,我在數據合同上實現了IExtensibleDataObject並在這一層而不是服務合同層進行管理。
缺點是很難跟蹤不同版本的合同,但是我正在練習半嚴格版本控制,對我來說效果很好。
我第二個是Roy,但是如果這是客戶端A和客戶端B之間的唯一區別。公開帶有參數IsSSNRequired的GetEmployee方法(可以具有默認的false值)不會有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.