你确实有冲突。当客户端试图提出一个要求说与{ 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/
而在这种情况下,很明显应该选择最近的路线,客户真的是警告的情况下,您可以指定一个Slug
和Id
,它根据您的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 });
Ahaaaa确定这有点儿有道理!斯科特你是个传奇人物 - 今晚我会看看。我想我对某件事做出了宽松的假设。我的OCD部分喜欢让他们都按照你的建议分开:) – iwayneo
@iwayneo真棒:) – Scott