2013-12-16 31 views
2

我正在爲許多不同的客戶建立webservices以連接到汽車零部件數據庫。這部分有各種各樣的屬性。不同的客戶需要不同的屬性子集來「做他們的事情」。「Flexible Webservice」的策略

所有客戶至少需要一個ID,一個零件號和一個名稱。有些可能需要價格,有些可能需要URL的圖像等等。下一個客戶端可能會在幾年後寫入,並需要不同的屬性子集。我寧願不發送超過他們需要的東西。

我一直在爲每個需求建立單獨的'PartDTO's'屬性子集,並將它們作爲單獨的webservice方法提供,以返回相同的部件列表,但每個部件具有不同的屬性。與其爲每個客戶端構建這個數據庫併爲DTO和方法提供邏輯名稱,我想爲客戶端指定他們想要的方式。我回JSON,所以我在想客戶遞給我一個JSON對象,列出他們在結果集所需的屬性:

RET = {的ImageUrl:真,RetailPrice:真實,...}

首先,這是否有意義?

其次,我不想在這裏丟失的是返回IEnumerable的好語法,並讓JSON工具序列化它。我當然可以建立一個'JSON'字符串並返回它,但這看起來很奇怪。

對此提出建議? C#'動態'?

+1

我已經看到API(Jira就是其中之一),可讓您在輸入中指定所需的字段。我認爲Jira使用查詢參數(展開他們稱之爲)。使它成爲逗號分隔的字段名稱列表。/v1/api/entity?fields = ImageUrl,RetailPrice這樣,任何給定的客戶端都可以請求其所有字段的特定子集。 – aet

回答

2

這是一個非常好的候選人Entity-Attribute-Value model。基本上你有一個ID,名稱,價值表,你可以讓每個客戶/方面存儲任何他們想要的東西......然後,當他們查詢你返回他們的名稱 - 值對,並讓他們隨心所欲地使用它們。

優點:超級靈活。適用於強大的模式增加複雜性與價值之間關係的情況。多個客戶端的單一端點。

缺點:通常不喜歡的模式,很難從高效選擇,也很難索引。但是,如果你所做的只是存儲並返回名稱值的集合,它應該沒問題。

0

我結束了去字典路線。我所定義的基類:

public abstract DictionaryAsDTO<T> : IReadOnlyDictionary<string, object> 
{ 
    protected DictionaryAsDTO(T t, string listOfProperties) 
    { 
     // Populate an internal dictionary with subset of t's props based on string 
    } 
} 

然後,DTO用於部分,像這樣:

public PartDTO : DictionaryAsDTO<Part> 
{ 
    public PartDTO(Part p, string listOfProperties) : base(p, listOfProperties) {} 

    // Override method to populate base's dictionary with Part properties based on 
    // listOfProperties 
} 

然後寫爲DictionaryAsDTO一個JSON.NET轉換器,其發射JSON-Y對象的屬性,而不是密鑰 - 的值對。

Web服務根據返回IEnumerable並序列化它們的查詢構建一個IEnumerable。

中提琴!