2017-09-15 31 views
0

我對Microsoft framework on ODATA的研究越多,我傾向於認爲它不適合企業應用。該框架期望所有的數據庫都直接作爲ViewModel公開,即使對於像分頁&這樣的簡單操作也是如此。ODATA是否使用Microsoft Web API真正的REST架構?

我們將被迫使用高雅的機制來保存呈現給JavaScript客戶端的頁面編號。

或者我不正確理解微軟提供的OData?

編輯-1:

是ODATA V4有狀態的架構?由微軟 模式團隊推廣。我沒有看到從 Asp.Net Web API(REST)到OData(Sounds STATEFUL)體系結構遷移的任何簡單路徑。

EDIT-2: 分頁,排序&分組是從客戶端進入的請求的一部分。

+0

https://stackoverflow.com/questions/2458407/difference-between-odata-and-rest-web-services –

+2

等等,是不是分頁部分客戶端發送的請求?除了標題之外,這看起來就像是你的一系列陳述,你真的有問題嗎? – Icepickle

+0

@DavidTansey,謝謝答案追溯到2010年。 – Abhijeet

回答

5

簡而言之,MS Odata服務器端的實現是而不是 statefull,它可以被認爲是一個REST架構。

我們將被迫使用stasteful機制堅持呈現給JavaScript客戶端

您提供尋呼在請求信息的頁碼。例如,如果你想10項2頁的你會採取前10名,並跳過10

odata-url/?$count=true&$top=10&$skip=10 

正如你可以看到客戶端/呼叫方指定分頁,沒有必要讓服務器跟蹤狀態的客戶。

同時加入$count=true將返回基於結果集中包含的傳入過濾器的記錄總數(在上例中沒有過濾器)。這將允許客戶計算頁面的數量。


框架要求所有的數據庫直接暴露視圖模型...

也是不正確。您可以返回IQueryable<T>,其中T是您的類型。 T不一定是EF模型。例如,從DbContext返回以下內容是可以接受的。

public IQueryable<SomeEntity> Get() { 
    return dbContext.SomeEntities 
     .Where(x => optionalPreFiltereExpression) 
     .Select(x => new SomeDTO(){ 
      Prop1 = x.Prop1, 
      Collection1 = x.CollectionOfInterest, 
      // etc 
     }); 
} 

爲了進一步說明這一點,你也可以返回對象的一個​​硬編碼名單,雖然這可能不是在生產中非常有可能。

public IQueryable<SomeEntity> Get() { 
    return new List<SomeDTO>(){ 
     new SomeDTO(){ 
      Prop1 = 5, 
      Prop2 = "Hi there" 
      // etc}, 
     new SomeDTO(){ 
      Prop1 = 6, 
      Prop2 = "Goodbye" 
      // etc} 
     }).AsQueryable(); 
} 

有關於OData的所有選項的資源。我不打算在這裏包括所有的東西,否則我可能只是創建第二套文檔。

+1

還有一件事要強調它的無狀態性質:從第1頁到第2頁的分頁可能導致兩次查看記錄。當f.i.在從用戶頁面1到頁面2開始頁面的時間內,假設記錄將是頁面1中的第一個頁面,頁面1的最後一個記錄將被推送到頁面2,則向數據集添加新記錄。 –

+0

@NielsV - 同意,但如果發生這種情況也取決於當前傳遞的任何過濾器(可能會排除添加的記錄)和傳遞的排序表達式。這個概念適用於大多數任何無狀態的程序,記錄可能會被改變,甚至被刪除,如果它在排序中看起來不同或者被排除/包含在過濾器中,這會改變在分頁操作中顯示的預期記錄。 – Igor

+0

考慮投票當前問題;-) – Abhijeet