2011-12-23 19 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路线走了,但你还没有指定。

相关问题