2016-10-30 2 views
0

UWPアプリのローカルデータベースをWEB APIサービスで更新しようとしています。 既存のエンティティIDのリストをWebサービスに送信し、他のエンティティをサービスから取得する必要があります。私にとってサービスごとにローカルデータベースを更新する方法は?

私のモデル

public class LibraryCategoryModel 
{ 
    public int ID { get; set; } 
    public string CategoryTitle { get; set; } 
    public byte[] Picture { get; set; } 
} 

web api

// GET: api/Category 
    public IQueryable<LibraryCategoryModel> GetLibraryCategoryModels(HttpRequestMessage request) 
    { 
     var string1 = request.Content.ReadAsStringAsync(); 
     List<int> existingIdCategoryList = new List<int>(); 
     existingIdCategoryList = JsonConvert.DeserializeObject<List<int>>(string1.Result); 
     var entityList = db.LibraryCategoryModels.ToList(); 
     foreach (var Id in existingIdCategoryList) 
     { 
      entityList = entityList.Where(item => item.ID != Id).ToList(); 
     } 
     return entityList as IQueryable<LibraryCategoryModel>; 
    } 

と私の要求

private async void LoadDataFromNetwork(List<int> CategoryIdList) 
    { 
     if (NetworkHelper.IsInternet() || NetworkHelper.HasInternet()) 
     { 
      using (HttpClient client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri(serviceUrl); 
       // Set requast 
       using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "Api/Category")) 
       { 
        // Set the Accept header for BSON. 
        request.Headers.Accept.Clear(); 
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/bson")); 
        string Content = await Task.Factory.StartNew(() => JsonConvert.SerializeObject(CategoryIdList)); 
        request.Content = new StringContent(Content, System.Text.Encoding.UTF8, "application/json"); 
        var response = await client.SendAsync(request); 
        response.EnsureSuccessStatusCode(); 
        // Use BSON formatter to deserialize the result. 
        MediaTypeFormatter[] formatters = new MediaTypeFormatter[] { new BsonMediaTypeFormatter() }; 
        try 
        { 
         var newCategorys = await response.Content.ReadAsAsync<LibraryCategoryModel[]>(formatters); 
         foreach (var category in newCategorys) 
         { 
          _dataService.InsertCategory(category); 
          AllCategoryList.Add(new LibraryCategoryViewModel(category)); 
          _newCategoryIdListFromNetWork.Add(category.ID); 
         } 
        } 
        catch (Exception) 
        { 

         throw; 
        } 

       } 

      } 
     } 
    } 

の私controllerこの作品が、私はこの方法が適切であることを確認しないと最高溶液。 私を案内してください。

+0

「この要求は私にとってうまくいかない」とはどういう意味ですか?エラーは何ですか? –

+0

@TóthTibor私の質問を更新する –

+0

@Bartこのサイトの存在を知らなかった –

答えて

2

最初に動作し、発生した特定の問題がない場合は、十分に機能している可能性があります。
これは潜在的に改善される可能性のある方法はたくさんありますが、「適切な方法」または「最良の解決策」の定義は常に意見に基づいています。ここでは、言った

は、いくつかの提案があります:LibraryCategoryModelで "モデル" を含む

  • は冗長です。私はそれを削除するだろう。
  • APIがIQueryableを返す必要がありますか?または、IEnumerable、または でもIListで十分でしょうか?常に必要なだけシンプルにしてください。
  • string1は意味がないため、変数の名前が不適切です。 requestContentのように、それが何を保持しているかを説明するものを使用してください。
  • APIメソッドに直接List<int>を入力してから、予期しない入力を処理する必要がなくなります。
  • APIメソッドへの予期しない入力、無効な入力、または欠落した入力を処理します。
  • 渡されたリストを通じて各繰り返しに対して新しいリストを作成するのではなく、結果を簡単に設定できるように、API内のforeachループのロジックを大幅に簡素化できます。
  • 静的なHTTPClientインスタンスhttps://skimming.net/why-you-should-reuse-httpclient-instances/を参照してください)
  • 例外をキャッチしてから新しいものを投げるだけではありません。このすべては例外情報を失います。少なくとも、例外を記録して何かをユーザーに報告する必要があります。
  • NetworkHelperのメソッド名では、それぞれの意味を明確に区別していません。彼らの名前とその意味を明確にするために名前を変更してください。
  • 接続などの条件が満たされていない場合は、何もしないでください。何かが不可能な場合にユーザーに指示し、問題を解決するために何ができるか、あるいは代替手段として行動することの指示を提供する。
  • 未処理のエラーをスローすると、成功したHTTPリクエストは行われません。あなたのコントロールを超える理由はたくさんあります。これは、成功したリクエストは不可能であり、クラッシュはそれを処理する方法ではないことを意味する可能性があります。
  • また、要求の失敗の処理が上記のコードとは別のコードで実行されている場合は、上記のコードをより保守しやすくなります。
  • APIからのさまざまなエンコーディングの組み合わせを使用すると、将来他のユーザー(または自分自身)を混乱させる可能性があります。あなたがJSONを送信するのに本当に良い理由があるのでなければ、両方のために同じものを使うべきです。
  • 他の場所でも使用することを想定して、コンテンツエンコードの定数を定義します。コード内の魔法の文字列は避けてください。特に、コードベース全体に重複する文字列は避けてください。
  • コードが何をしているかを説明するコメントを削除します。これはコードを読めば明らかです。必要に応じてコードを明確にします。コードが何をしていると言うコメントを持つことは、実際にはもっと混乱する可能性があります。特にコードは変更されても、コメントには反映されません。
  • JSONをシリアル化するタスクの作成を待つ必要はないようです。間違いがなければ削除してください。 (もしあれば、文書を追加してください。)
  • LoadDataFromNetwork複数の方法に分割すると、要求を作成し、要求を行い、応答を処理するために、保守性が向上します。
  • 複数の「カテゴリ」が「カテゴリ」
  • 返されたカテゴリの処理が混乱しているようです。おそらく、クラスレベルの変数と静的なリストがあります。 _newCategoryIdListFromNetWork変数は、クラスではなく、このメソッドにもっと密接に関連しているように見え、クラスに関連するロジックがクラスの周りに過度に分散している可能性があります。
関連する問題