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 メソッドが少し変更され、モデルを返す代わりに、API を介して実際に公開したい情報を持つ DTO オブジェクトを返すようになりました。
[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 に変更されたことに気付きました。クライアント アプリケーションではゲームのモデルが Game.cs と呼ばれているため、restsharp の問題のようです。クライアント アプリケーションを機能させるためにクライアント モデルは、サービス (GameDTO) の DTO オブジェクトと同じ名前にする必要があります。私はこの解決策が少し奇妙だと思ったので、私の質問: DTO とクライアント モデルに同じ名前を付けずに動作させる方法はありますか?
助けていただければ幸いです...よろしくお願いします。