我有以下请求对象:
[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上有相互矛盾的路线?
怎么会这样?他们是非常不同的。调用get的代码是:
var blahResult = _client.Get(new GetBlahRequest
{
Id = model.BlahId
});
我在这里错过了什么吗?
答案 0 :(得分:1)
你确实有冲突。因为GetBlahRequest
DTO在使用Blah
进行扩展时相当于:
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; }
}
当客户端尝试使用{ Id = 123 }
发出请求时,它无法知道要选择哪3条路线。如果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 });