如何通过服务更新本地数据库?

时间:2016-10-30 08:01:55

标签: uwp asp.net-web-api2 httprequest httpclient bson

我尝试通过WEB API服务更新public class LibraryCategoryModel { public int ID { get; set; } public string CategoryTitle { get; set; } public byte[] Picture { get; set; } } app中的本地数据库。 我需要将现有实体ID的列表发送到Web服务,并从服务中获取其他实体。

我的模特

controller

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;
                    }

                }

            }
        }
    }

和我的要求

0x003b1240

这项工作对我来说,但我不确定这种方式是正确和最佳的解决方案。 请指导我。

1 个答案:

答案 0 :(得分:2)

首先,如果它有效,并且您没有遇到任何具体问题,那么它可能已经足够了。
有很多方法可以改进,但定义了一种正确的方式&#34;或者&#34;最佳解决方案&#34;将始终以意见为基础。

那说,这里有一些建议:

  • 包括&#34;模型&#34;在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但请求BSON,否则您应该同时使用它们。
  • 假设您还在其他地方使用它们,请为您的内容编码定义常量。避免在代码中使用魔术字符串 - 尤其是在代码库中重复的字符串。
  • 删除记录代码正在执行操作的注释。通过阅读代码应该清楚这一点。如果需要,使代码更清晰。有评论说明代码正在做什么实际上可能更令人困惑。特别是如果代码发生了变化,但评论不是。
  • 等待创建任务只是为了序列化JSON似乎是不必要的。如果不是绝对需要删除。 (如果是,请添加文档原因。)
  • LoadDataFromNetwork做了很多事情,如果分成多种方法,可能会更易于维护:创建请求,发出请求和处理响应。
  • &#34;类别&#34;的复数形式是&#34;类别&#34;
  • 返回类别的处理似乎很混乱。有可能是类级别变量和静态列表。 _newCategoryIdListFromNetWork变量看起来应该与这个方法更紧密地联系在一起,而不是类,任何与之相关的逻辑都可能过度分布在类中。