0

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™&lt;/Name>
    <Description>
     ...
    </Description>
    <Developer>BioWare Corp.eeeddd</Developer>
 </GameDTO>
 <GameDTO
  .
  .
  . 
 </GameDTO>
</ArrayOfGameDTO>

xml ルート タグが ArrayOfGame から ArrayOfGameDTO に変更されたことに気付きました。クライアント アプリケーションではゲームのモデルが Game.cs と呼ばれているため、restsharp の問題のようです。クライアント アプリケーションを機能させるためにクライアント モデルは、サービス (GameDTO) の DTO オブジェクトと同じ名前にする必要があります。私はこの解決策が少し奇妙だと思ったので、私の質問: DTO とクライアント モデルに同じ名前を付けずに動作させる方法はありますか?

助けていただければ幸いです...よろしくお願いします。

4

1 に答える 1

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のデフォルト)を使用していると仮定します。ここを参照してください。NameDataContract

于 2011-10-17T20:36:55.317 に答える