我已经设置了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)中的de DTO对象具有相同的名称。我发现这个解决方案有点奇怪,所以我的问题是:有没有一种方法可以让DK和客户端模型的命名相同?
任何帮助都会很感激...提前致谢。
答案 0 :(得分:1)
您可以尝试执行以下操作
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默认值),因此您可以使用Name
属性的DataContract
属性,请参阅here。