2013-10-01 48 views
2

我正在評估ServiceStack作爲我們想要在我們的系統環境中使用的可能的REST服務,到目前爲止我對此非常滿意。 對服務的要求是爲特定用戶或用戶組隱藏字段。取決於用戶擁有的鍵/會話 並非數據模型的所有字段都返回給客戶端,並且它們必須被服務棧隱藏。因此,在接收到來自Linq2SQL的數據對象(列表) 後,我使用反射分析對象,提取對象成員,忽略應該隱藏的成員,並將其他成員添加到字典中。之後我將字典傳遞給ServiceStack,將其序列化並將數據結構發送給客戶端。使用ServiceStack隱藏輸出成員

我的問題,這種設置是:

  • 這是正確的方式與ServiceStack做到這一點還是我上濫用 漏洞,將盡快解決?
  • 是否有ServiceStack的方式來實現相同?
  • 有什麼最佳實踐可以推薦?
+0

此問題似乎是無關緊要的,因爲它是針對外部服務的支持請求,應該針對該服務。 – Ben

+2

我不認爲問題是偏題。 – stefan2410

+0

我對這個問題也很感興趣。我想,如果我們討論JavaScript客戶端/ jQuery Ajax,那麼根據用戶權限,使用從JSON中排除特定字段的函數是可能的。我不知道是否有這樣的功能。對於類型化的C#客戶端來說,這是不可能的,只有服務代碼將響應對象中的特定字段留空。但用戶現在會知道這些字段存在。 – stefan2410

回答

3

使用ServiceStack執行此操作的正確方法是爲API的目的定義DTO,而不是嘗試使用現有的業務對象。如果您的客戶準備解析列表,則返回帶有字典屬性的DTO可以起作用。

一個'ServiceStack'的方法是定義一個簡單的,平坦的,具有所有可能屬性的DTO,其中每個屬性都是可空的。

鑑於DTO定義如下:

public class NullablePartials 
{ 
    public Int32? Test1 { get; set; } 
    public String Test2 { get; set; } 
    public Double? Test3 { get; set; } 
} 

下面的片段:

Dictionary<String, String> MyDtoDictionary = new Dictionary<String, String>(); 
MyDtoDictionary.Add("Test1", "7"); 
MyDtoDictionary.Add("Test2", "Value2"); 
NullablePartials result = MyDtoDictionary.ToJson().FromJson<NullablePartials>(); 

System.Diagnostics.Debug.WriteLine(MyDtoDictionary.ToJson()); 
System.Diagnostics.Debug.WriteLine(result.ToJson()); 

產生:使用ServiceStack.Text作爲其默認設置您的JSON庫

{"Test1":"7","Test2":"Value2"} 
{"Test1":7,"Test2":"Value2"} 

序列化空值。

至於最佳實踐,請參閱https://github.com/ServiceStack/ServiceStack/wiki/Advantages-of-message-based-web-services,其中討論了ServiceStack哲學。特別推薦使用:

代碼優先POCO的

由於它促進清潔,可重用的代碼,ServiceStack一直鼓勵使用代碼優先POCO對剛纔的一切。即同POCO可用於:

  • 在Request和Response DTO的(客戶端和服務器)
  • 在JSON,JSV和CSV文本序列化
  • 作爲OrmLite,db4o的數據模型和NHibernate
  • 作爲實體存儲在Redis的
  • 爲Blob存儲在緩存和會話
  • 下降,在MQ的服務
  • 脫水複雜configuratio執行ns進入

利用不同的技術,其功能建立在POCO提供的無重複使用級別,減少摩擦,促進一致,更實用和更容易理解代碼庫。

+0

感謝marfarma的回答。 你的例子更像或者像我選擇的方法一樣。我還以遞歸的方式添加了對象包含。 我希望這不是一個漏洞,將有一天由服務棧修復 –

+0

這是另一個問題:http://stackoverflow.com/a/18993146/149060供您考慮。 –