1

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

4

2 回答 2

2

由于 2 条路由不包含到任何变量的任何映射并且都注册了相同的请求,因此您将无法仅从请求 DTO 中分辨出匹配的路由,例如:

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

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

如果它映射到一个变量,例如:

Routes
  .Add<GameConsole>("/consoles", "GET")
  .Add<GameConsole>("/consoles/{Action}", "GET");

然后您可以通过查看填充的request.Action.

但是,如果它们有不同的行为并返回不同的响应,那么它们应该只是 2 个独立的服务,例如:

Routes
  .Add<GameConsole>("/consoles", "GET")
  .Add<GameConsoleCount>("/consoles/count", "GET");

另一种选择是只有一个粗粒度服务返回两个服务的组合数据集(即也包含计数),这样同一个服务可以满足两个请求。

于 2013-06-28T03:45:35.623 回答
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 都在共享大量数据的家庭中。

于 2014-03-27T15:38:49.103 回答