2016-12-20 6 views
0

こんにちは、私はWEBAPI休憩サービスを開発しています。現在、私は別の辞書を返すエンドポイントに取り組んでいますASP.NET WebApi - 2つのJSON "return"タイプがありますか?

少しイントロJSONで(エンティティの配列は、Dictionaryデータタイプと混同しないでください)フォーマット。辞書は名前で検索することができます:/dictionaries/:dictName。問題は、アイテムが2種類のものとすることができる辞書に保管ということである:実体の

まずタイプ

class Item { 
    public long ID { get; set; } 
    public string Name { get; set; } 
} 

エンティティの第二のタイプ - 拡張項目

class ExtendedItem : Item { 
    public string AdditionalProperty { get; set; } // Let's name it this way just for example 
} 

問題は

私はそれを必要としない辞書のためにAdditionalPropertyを送ることを避けたいと思います。私は見つけることができたものの

public IHttpActionResult GetDict(string name) 
{ 
    try 
    { 
     object outDict = null; 

     switch(name) { 
      case "simpleDict": 
       IList<Item> simpleDict = _dataLayer.GetSimpleDict(); 
       // ... 
       outDict = simpleDict; 
       break; 
      case "extDict": 
       IList<ExtendedItem> extDict = _dataLayer.GetExtDict(); 
       // ... 
       outDict = extDict; 
       break; 

      // ... and a few more dictionaries 
     } 

     SomeLogger.SomeLogging(name, outDict); 
     return Ok(outDict); 
    } 
    catch (Exception ex) 
    { 
     // Just returning error 
     return BadRequest(ex.Message); 
    } 

} 

結論と質問

:私はシンプルApiControllerのメソッドを開発しました


現在のソリューション問題の解決策、私はそれに完全に満足していない。個人的には、objectデータ型の使用を避けるための簡単な方法を探したいと思いますが、何もできませんでした。そして今質問が来る:

  1. このようなソリューションを実装するためのより良いプログラム的な方法は何でしょうか?私のためにが良いは、objectタイプを使用しないで解決策を意味します。 IListにItemやExtendedItemを含めるように制限する簡単な方法はありますか?
  2. 問題のアプローチを完全に変更する必要がありますか?
  3. または...このアプローチは正しいと思いますが、私は少し過敏ですか? ;-)

私は何か助けに感謝します。

+0

はどうなりますか?派生型を直接割り当てることができるはずです。 – krillgar

+0

それはそれほど簡単ではないと私は信じられない!魅力のように動作します。可能であれば、私はそれを受け入れることができるように回答を追加してください。そして、ありがとう;-) – PJDev

答えて

1

に、あなたは直接割り当てることができます。

IEnumerable<Base> outDict = null; 

switch(name) { 
    case "simpleDict": 
     IList<Item> simpleDict = _dataLayer.GetSimpleDict(); 
     // ... 
     outDict = simpleDict; 
     break; 
    case "extDict": 
     IList<ExtendedItem> extDict = _dataLayer.GetExtDict(); 
     // ... 
     outDict = extDict; 
     break; 

    // ... and a few more dictionaries 
} 
+0

混乱して申し訳ありません。コメントのあなたの答えは正しかったし、魅力のように働く。私はちょっとした間違いを犯して、あなたのコメントに返信した直後にそれを実現しました。これは本当に素晴らしいようですが、私は最初のものに固執します:-)ありがとう! – PJDev

+1

私は自分のコメントに合わせて自分の答えを修正しました。私が持っていた方法は不必要でした。 – krillgar

0

Interfaceを使用してExtendedItemの実装を解放してください。 APIの戻り値としてObjectを使用すると、コールバック応答を返す前に、さまざまな処理を行う型の動的処理が必要な場合に便利です。あなたの代わりにobjectのコレクションとしてあなたoutDict変数を宣言する場合

interface Item { 
    public long ID { get; set; } 
    public string Name { get; set; } 
} 

class SimpleItem : Item { 
    public long ID { get; set; } 
    public string Name { get; set; } 
} 

class ComplicateItem: Item { 
    public long ID { get; set; } 
    public string Name { get; set; } 
    public string AdditionalProperty { get; set; } 
} 

はその後、APIコントローラ、

Item outDict; 

    switch(name) { 
     case "simpleDict": 
      var simpleDict = _dataLayer.GetSimpleDict(); 
      // ... 
      outDict = simpleDict; 
      break; 
     case "extDict": 
      var extDict = _dataLayer.GetExtDict(); 
      // ... 
      outDict = extDict; 
      break; 

     // ... and a few more dictionaries 
    } 
+0

フィードバックいただきありがとうございますが、私のケースでは、オブジェクト 'simpleDict'と' extDict'は単純なオブジェクトではなくオブジェクトのリストです。さらに、私はすでに他の投稿で満足のいく回答を得ています。 – PJDev

0

あなただけのようにもswitch文で返すことができます:あなたが `` タイプのoutDict`は `IEnumerableを作る場合

public IHttpActionResult GetDict(string name) 
{ 
    try 
    { 
     switch(name) { 
      case "simpleDict": 
       return Ok(_dataLayer.GetSimpleDict()); 
      case "extDict": 
       return Ok(_dataLayer.GetExtDict()); 
     } 

     SomeLogger.SomeLogging(name, outDict); 
     return Ok(new List<Item>()); 
    } 
    catch (Exception ex) 
    { 
     // Just returning error 
     return BadRequest(ex.Message); 
    } 
} 
+0

答えをありがとう。単純なケースでは大丈夫でしょうが、私のコードでは、スイッチの各ブロックに対してデータロギングと他のいくつかの命令を繰り返し実行する必要があります。そのため、私はローカル変数を作成しました。最後に一度それを行い、クライアントにデータを返します。 – PJDev

関連する問題