2011-12-23 69 views
0

我想用一個處理程序和一個URI註冊多個資源。我想確認這是否可以在公開的rasta中進行。 我已經瀏覽了一些關於開放式rasta的網站,但無法斷定這是否可行?我可以使用Open Rasta中的一個處理程序和一個URI註冊多個資源嗎?

ResourceSpace.Has 
      .ResourcesOfType<Request>() 
      .AtUri("/processing") 
      .HandledBy<SomeHandler>() 
      .TranscodedBy<SomeCodec>();  

我需要處理從基類「請求」派生的所有請求。 如果有人能夠真正揭示這一點,那將會很棒。

+0

如果OpenRasta框架強制執行此操作,但沒有嘗試爲一個資源註冊多個資源,這肯定違反了REST架構風格。一個資源可以有許多URI(地址),但是一個URI只應該**地址**一個資源。 – 2011-12-23 18:34:13

+0

@SixtoSaez:我理解你的觀點,但你不認爲這只是一個觀點,你如何看待你的資源。我有一個觀點,即所有的都是「請求」類型。所以我沒有看到他們作爲不同的資源。 – 2011-12-26 05:34:57

+0

如果您想要表示資源的不同「視圖」,那麼您要使用的是OpenRasta中的不同編解碼器。在REST中,可以使用不同的媒體類型(編解碼器)來表示給定的資源,但地址只應標識特定的資源。 – 2011-12-26 21:42:41

回答

2

所以,如果所有的請求,並要隧道的東西,你可以使用你所提供的登記。

匹配將基於最逼近型來完成,所以

public void Post(SpecificRequest specificRequest) { /*handles the SpecificRequest type */ } 
public void Post(Request myRequest) { /* handles the default case */ } 

這就是說,要知道,在RESTful系統中,我們往往會嘗試和識別不同事情有不同的URI,導致一個每種類型的註冊。

2

在我相當有限的OpenRasta經驗中,您可以使用.And方法來添加額外的.AtUri資源位置。

I.e.你的情況

ResourceSpace.Has 
     .ResourcesOfType<Request>() 
     .AtUri("/processing").And.AtUri("/processing/{processid}") 
     .HandledBy<SomeHandler>() 
     .TranscodedBy<SomeCodec>(); 

其中{柯利括號}指定你的處理方法,即輸入參數:

public class SomeHandler 
{ 
    public Request Get(int processid = 0) //specify a default value for the uri case /processed 
    { 
     if (processid == 0) 
      return Context.Set<Request>().ToList(); //Context comes from my DbContext derived class which is part of my entity model. 
     else 
      return GetRequestFromProcessId(processid) //this is a private method in your handler class using Linq to SQL to retreive the data your interested in. I can't see your handler so I'm making it up. 
    } 
} 

我的OpenRasta文檔中發現一張紙條,上面specifed,你必須有destinct(只一個)ResourceSpace定義每個匹配的類型和處理程序。換句話說,您不能使用相同的HandledBy處理程序類複製相同的ResourceOfType類。我測試了這一點,情況就是這樣,也許你爲什麼首先提出這個問題。

N.b.這段代碼是完全沒有經過測試的,我剛剛把我寫的代碼寫在你的類和uri中已知的地方。這也假設你正試圖從HTTP GET動詞中檢索數據。另一個貢獻者沿着POST路線走了,但你還沒有指定。

相關問題