如何通过服务更新本地数据库?
how to update local database by service?
我尝试通过 WEB API
服务更新 UWP
应用程序中的本地数据库。
我需要将现有实体 ID 的列表发送到 Web 服务并从服务中获取其他实体。
我的模型
public class LibraryCategoryModel
{
public int ID { get; set; }
public string CategoryTitle { get; set; }
public byte[] Picture { get; set; }
}
和我的 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;
}
}
}
}
}
这对我有用,但我不确定这种方式是正确的最佳解决方案。
请指导我。
首先,如果它有效并且没有您遇到的具体问题,那么它可能就足够了。
有很多方法可以改进,但 "proper way" 或 "best solution" 的定义将始终基于意见。
也就是说,这里有一些建议:
- 在
LibraryCategoryModel
中包含 "Model" 是多余的。我会删除它。
- 您的 API 需要 return 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
做了很多,如果分成多个方法可能更易于维护:用于创建请求、发出请求和处理响应。
- "category"的复数形式是"categories"
- returned 类别的处理似乎很混乱。大概有 class 级变量和静态列表。
_newCategoryIdListFromNetWork
变量看起来应该与此方法更紧密地联系在一起,而不是 class 并且与它相关的任何逻辑都可能过度分布在 class. 周围
我尝试通过 WEB API
服务更新 UWP
应用程序中的本地数据库。
我需要将现有实体 ID 的列表发送到 Web 服务并从服务中获取其他实体。
我的模型
public class LibraryCategoryModel
{
public int ID { get; set; }
public string CategoryTitle { get; set; }
public byte[] Picture { get; set; }
}
和我的 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;
}
}
}
}
}
这对我有用,但我不确定这种方式是正确的最佳解决方案。 请指导我。
首先,如果它有效并且没有您遇到的具体问题,那么它可能就足够了。
有很多方法可以改进,但 "proper way" 或 "best solution" 的定义将始终基于意见。
也就是说,这里有一些建议:
- 在
LibraryCategoryModel
中包含 "Model" 是多余的。我会删除它。 - 您的 API 需要 return 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
做了很多,如果分成多个方法可能更易于维护:用于创建请求、发出请求和处理响应。- "category"的复数形式是"categories"
- returned 类别的处理似乎很混乱。大概有 class 级变量和静态列表。
_newCategoryIdListFromNetWork
变量看起来应该与此方法更紧密地联系在一起,而不是 class 并且与它相关的任何逻辑都可能过度分布在 class. 周围