ServiceStack:编写API而不需要多个DTO?

时间:2013-06-28 02:41:49

标签: servicestack

主题可能不清楚,但我想公开两个几乎相同的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传递给我的服务方法,即使它根本没有被使用(映射到路由是唯一的目的?)

2 个答案:

答案 0 :(得分:2)

由于2条路由不包含任何变量的映射并且都使用相同的请求进行注册,因此您无法仅通过Request DTO告知匹配的路由,例如:

public object Get(GameConsole request)
{
    return mRepository.GetConsoles();
}

即。您需要反省 base.Request 并查看。PathInfoRawUrlAbsoluteUri以区分差异。

如果映射到变量,例如:

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都在共享大量数据的系列中。

相关问题