2016-09-03 30 views
0

我正在爲第三方產品構建一個Asp.Net Web API,並且正在考慮將OData 4用於我的API。我在我的對象模型中有相當大的自由度,但不能改變底層的數據模型。如何在創建odata API時處理複雜的關係?

我知道odata支持導航屬性來定義關係,但它們似乎只是對象之間的直接鏈接。在建立在關係上的數據模型中,很多情況下都有自己的屬性。例如,「用戶」具有與組,組織單位等的「成員關係」的集合,並且「成員」鏈接本身具有「默認」布爾屬性。在某些情況下,關係有多個屬性。

有沒有最好的方法來處理這個問題?我是否需要創建具有屬性的「成員資格」實體,並且從具有導航屬性的用戶(用戶>會員資格>羣組)中擁有兩個躍點?我是否應該創建一個'會員'複雜類型,創建一個'會員'屬性,這是'會員'的集合,並在'會員'上有一個導航屬性(如果可能的話)?爲了方便起見,使用這些選項中的任何一個,我還應該爲只讀組的所有成員添加一個只讀導航屬性(用戶>組)?

感謝

回答

0

從靜止的角度(見Richardson Maturity Model level 3),一旦導航到user資源,客戶端可以發現一個group-query關係(鏈接)。以下是這可能看起來在等工具來HAL Browser

"api:group-query": { 
    "href": "http://apiname:port/api/group?userId=1,pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}" 
}, 

這就需要消費者的group資源(分頁)收集用戶是的成員:

GET /api/user/1/groups

這可能會返回類似如下:

{ 
    "groups": [ 
     { 
     "id": 123, 
     "name": "Test Group" 
     }, 
     { 
     "id": 134, 
     "name": "Tennis squad" 
     } 
    ] 
} 

我看不到需要membership資源/權益如果你整合鏈接。

+0

謝謝亞歷山德魯。我的問題是關於用戶和組之間的鏈接具有哪些屬性,儘管我不認爲你的回答地址。 – AndrewS

+0

查看有關[目標屬性](https://tools.ietf.org/html/rfc5988#section-5.4)的Web鏈接規範,看起來應該能夠[擴展](https://工具。 ietf.org/html/rfc5988#section-6.3)他們與應用程序特定的數據。 –