主题可能不清楚,但我想公开两个几乎相同的API调用,如下所示:
Routes
.Add<GameConsole>("/consoles", "GET")
.Add<GameConsole>("/consoles/count", "GET");
我现在拥有的是“/ consoles”,它为我提供了我的存储库中所有GameConsole对象的列表。我想添加的是“/ consoles / count”,它给我一个来自我的存储库的所有GameConsole对象的计数。
但由于该服务只能在路线中映射一个DTO,我只能:
public object Get(GameConsole request)
{
return mRepository.GetConsoles();
}
不确定我是否真正理解只有一个路线图到DTO的局限性;有没有解决的办法?作为旁注,似乎很奇怪我必须将DTO传递给我的服务方法,即使它根本没有被使用(映射到路由是唯一的目的?)
答案 0 :(得分:2)
由于2条路由不包含任何变量的映射并且都使用相同的请求进行注册,因此您无法仅通过Request DTO告知匹配的路由,例如:
public object Get(GameConsole request)
{
return mRepository.GetConsoles();
}
即。您需要反省 base.Request 并查看。PathInfo
,RawUrl
或AbsoluteUri
以区分差异。
如果映射到变量,例如:
Routes
.Add<GameConsole>("/consoles", "GET")
.Add<GameConsole>("/consoles/{Action}", "GET");
然后,您可以通过查看已填充的request.Action
。
但如果他们有不同的行为并返回不同的回答,那么他们应该只是两个独立的服务,例如:
Routes
.Add<GameConsole>("/consoles", "GET")
.Add<GameConsoleCount>("/consoles/count", "GET");
另一种选择是只有一个粗粒度服务,它返回两个服务的组合数据集(即也包含计数),这是同一服务可以满足两个请求的方式。
答案 1 :(得分:0)
在非常类似的情况下,我一直在为每个单独的路由服务创建一个子类DTO,继承共享元素。
它一直运作良好。
所以模式是
public class SharedRequestDto
{
public string CommonItem { set; get; }
public string CommonId { set; get; }
}
然后
[Route("/api/mainservice")]
public class MainServiceRequest : SharedRequestedDto
{
}
[Route("/api/similarservice")]
public class SimilarServiceRquest : SharedRequestDto
{
public string AddedItem { set; get; }
}
这允许将不同但相似的DTO路由到各个服务以处理它们。没有必要进行内省。
您仍然可以在具体服务后面使用公共代码,因为他们可以假设他们的请求对象参数是SharedRequestDto
。
它可能不是每个用例的正确解决方案,但它是有效的,特别是因为我的许多DTO都在共享大量数据的系列中。