2014-03-28 38 views
0

我有以下的请求对象:Servicestack冲突的路线?

[Route("/Model/Blah/BySlug/{Slug}/", "GET")] 
[Route("/Model/Blah/ByBlahSeriesId/{SomeOtherId}/", "GET")] 
[Route("/Model/Blah/ById/{Id}/", "GET")] 
public class GetBlahRequest : Blah, IReturn<BlahResponse> 
{ 
    public int Start { get; set; } 
    public int Limit { get; set; } 

} 

[Route("/Model/Blah/", "POST")] 
public class PostBlahRequest : Blah, IReturn<BlahResponse> 
{ 

} 

[Route("/Model/Blah/", "PUT")] 
public class PutBlahRequest : Blah, IReturn<BlahResponse> 
{ 

} 

而且我被告知有对GET冲突的路线?

这怎么可能?他们是非常不同的。调用得到的代码是:

var blahResult = _client.Get(new GetBlahRequest 
      { 
       Id = model.BlahId 
      }); 

我失去了一些东西在这里?

回答

2

你确实有冲突。当客户端试图提出一个要求说与{ Id = 123 }它无法知道是哪个人的路线可供选择

public class GetBlahRequest 
{ 
    public int Id { get; set; } 
    public int BlahSeriesId { get; set; } 
    public string Slug { get; set; } 
    public int Start { get; set; } 
    public int Limit { get; set; } 
} 

:因为你的GetBlahRequest DTO时Blah扩展将是等效。如果BlahSeriesId不可为空(int?),则默认为0,Slug将默认为null,但将被视为空。它有效地看到这三条路线:

/Model/Blah/BySlug// 
/Model/Blah/ByBlahSeriesId/0/ 
/Model/Blah/ById/123/ 

而在这种情况下,很明显应该选择最近的路线,客户真的是警告的情况下,您可以指定一个SlugId,它根据您的DTO是完全有效的,并认为啊!

GetBlahRequest 
{ 
    Id = 123, 
    Slug = "Something" 
} 

会导致三种可能的途径:

/Model/Blah/BySlug/Something/ 
/Model/Blah/ByBlahSeriesId/0/ 
/Model/Blah/ById/123/ 

虽然这是多一点的工作,该线路应分开,以DTO的更清晰的意图。

public class GetBlahRequest : Blah 
{ 
    public int Start { get; set; } 
    public int Limit { get; set; } 
} 

[Route("/Model/Blah/ById/{Id}/", "GET")] 
public class GetBlahById : GetBlahRequest, IReturn<BlahResponse> 
{ 
} 

[Route("/Model/Blah/BySlug/{Slug}/", "GET")] 
public class GetBlahBySlug : GetBlahRequest, IReturn<BlahResponse> 
{ 
} 

[Route("/Model/Blah/BySeriesId/{BlahSeriesId}/", "GET")] 
public class GetBlahBySeriesId : GetBlahRequest, IReturn<BlahResponse> 
{ 
} 

然后在动作方法:

public BlahResponse Get(GetBlahById request) 
{ 
    return GetBlah(request); 
} 

public BlahResponse Get(GetBlahBySlug request) 
{ 
    return GetBlah(request); 
} 

public BlahResponse Get(GetBlahBySeriesId request) 
{ 
    return GetBlah(request); 
} 

BlahResponse GetBlah(GetBlahRequest request) 
{ 
    // Code to return BlahResponse 
    return ... 
} 

那么你的客户端需要拨打:

var blahResult = _client.Get(new GetBlahById { Id = model.BlahId }); 
+0

Ahaaaa确定这有点儿有道理!斯科特你是个传奇人物 - 今晚我会看看。我想我对某件事做出了宽松的假设。我的OCD部分喜欢让他们都按照你的建议分开:) – iwayneo

+0

@iwayneo真棒:) – Scott