当使用restsharp时,我的模型对象是否必须与我的WCF Web Api DTO对象具有相同的名称?

本文关键字:对象 我的 DTO Api Web restsharp 模型 是否 WCF | 更新日期: 2023-09-27 18:11:25

我已经设置了一个WCF Web Api服务,一切工作正常,直到我开始使用dto来公开数据。

之前我在WCF服务上有我的模型对象,叫做Game.cs:

public class Game
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string Developer { get; set; }
    public Genre Genre { get; set; }
    public string Name { get; set; }
    public decimal? Price { get; set; }
    public string Publisher { get; set; }
    public Rating Rating { get; set; }
    public DateTime? ReleaseDate { get; set; }
}

服务中的get方法如下所示:

public IQueryable<Game> GetGames()
    {
        var db = new XBoxGames();
        var games = db
            .Games
            .Include("Genre")
            .Include("Rating")
            .OrderBy(g => g.Id)
            .ToList()
            .AsQueryable();
        return games;
    }

在MVC 3客户端应用程序中,我有一个控制器动作,请求我所有的游戏:(我使用restsharp)

public ActionResult Index()
    {
        var request = new RestRequest(Method.GET);
        var restClient = new RestClient();
        restClient.BaseUrl = "http://localhost:4778";
        request.Resource = "games";
        var response = restClient.Execute<List<Game>>(request);
        var games = response.Data;
        return View(games);
    }

和客户端模型:

public class Game
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Developer { get; set; }
    public int GenreId { get; set; }
}

在我开始使用dto后,客户端没有得到任何关于任何游戏的信息,即使服务返回信息。服务中的get方法改变了一点,现在返回的不是模型,而是DTO对象它包含了我想通过API公开的信息:

[WebGet(UriTemplate = "")]
    public IQueryable<GameDTO> GetGames()
    {
        var db = new XBoxGames();
        var games = db
            .Games
            .Include("Genre")
            .Include("Rating")
            .OrderBy(g => g.Id)
            .ToList();
        var gamesDTO = Mapper.Map<List<Game>, List<GameDTO>>(games);
        return gamesDTO.AsQueryable();
    }

DTO对象具有以下结构:

public class GameDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Developer { get; set; }
    public string GenreName { get; set; }
}

服务返回的xml看起来像这样:

<ArrayOfGameDTO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <GameDTO>
    <Id>3</Id>
    <Name>Jade Empire™</Name>
    <Description>
     ...
    </Description>
    <Developer>BioWare Corp.eeeddd</Developer>
 </GameDTO>
 <GameDTO
  .
  .
  . 
 </GameDTO>
</ArrayOfGameDTO>

我注意到xml根标签现在已经从ArrayOfGame改为ArrayOfGameDTO,这似乎是restsharp的一个问题,因为在我的客户端应用程序中,我的游戏模型称为Game.cs,所以为了让客户端应用程序工作,我的客户端模型需要在服务(GameDTO)中具有与DTO对象相同的名称。我发现这个解决方案有点奇怪,所以我的问题是:有没有一种方法可以让事情正常工作,而不需要dto和客户端模型命名相同?

任何帮助都会很感激……

当使用restsharp时,我的模型对象是否必须与我的WCF Web Api DTO对象具有相同的名称?

您可以尝试执行以下操作

namespace MyDTONamespace {
  public class Game { ... }
}

为您服务:

using DTO = MyDTONamespace;
namespace MyServiceNamespace {
  public class MyService {
    [WebGet(UriTemplate = "")]
    public IQueryable<DTO.Game> GetGames() {
      var db = new XBoxGames();
      var games = db
          .Games
          .Include("Genre")
          .Include("Rating")
          .OrderBy(g => g.Id)
          .ToList();
      var gamesDTO = Mapper.Map<List<Game>, List<DTO.Game>>(games);
      return gamesDTO.AsQueryable();
    }
  }
}

我很好奇这是什么序列化,但我认为这可以工作。

编辑:我以为你在客户端把它们重命名为DTO。

我能想到的另一种选择是使dto能够感知序列化。我假设你正在使用DataContractSerializer (WCF默认),所以你可以使用DataContract属性的Name属性,见这里。