我在
跟踪了eShopOnContainer项目https://github.com/dotnet-architecture/eShopOnContainers
在浏览代码时我发现Xamarin端的ProfileViewModel会启动,它会进行后端调用
var orders = await _orderService.GetOrdersAsync(authToken);
GetOrdersAsync的返回类型是Models.Orders.Order,它有许多属性,但Ordering.API.Controllers有一个GetOrders函数(假设在这种情况下调用它)
[Route("")]
[HttpGet]
[ProducesResponseType(typeof(IEnumerable<OrderSummary>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetOrders()
{
var orders = await _orderQueries.GetOrdersAsync();
return Ok(orders);
}
的返回类型为OrderSummary,它只有4个ProfileView.xaml所需的属性
我的问题是OrderSummary是如何映射到Order的。
更多GetOrdersAsync调用通用的GetAsync函数,如下所示。
public async Task < TResult > GetAsync < TResult > (string uri, string token = "") {
HttpClient httpClient = CreateHttpClient(token);
HttpResponseMessage response = await httpClient.GetAsync(uri);
await HandleResponse(response);
string serialized = await response.Content.ReadAsStringAsync();
TResult result = await Task.Run(() =>
JsonConvert.DeserializeObject < TResult > (serialized, _serializerSettings));
return result; }
代码有效。只是想了解如何。
答案 0 :(得分:0)
看eShopOnContainers,我可以看到:
课程'订单'&amp; 'OrderSummary'使用相同的名称共享相同的属性('OrderSummary'包含的属性少于'Order')
public class Order
{
public int ordernumber { get; set; }
public DateTime date { get; set; }
public string status { get; set; }
public string description { get; set; }
public string street { get; set; }
public string city { get; set; }
public string zipcode { get; set; }
public string country { get; set; }
public List<Orderitem> orderitems { get; set; }
public decimal total { get; set; }
}
public class OrderSummary
{
public int ordernumber { get; set; }
public DateTime date { get; set; }
public string status { get; set; }
public double total { get; set; }
}
通用的“GetAsync()”方法将字符串(JSON字符串)反序列化为所需的对象。这意味着JSON反序列化器尝试匹配来自服务器的属性字符串名称以匹配TARGET类型的属性(泛型类型)。
由于'OrderSummary'的所有属性也存在于'Order'类中,您可以将JSON的'OrderSummary'对象“映射”到'Order'实例中。 “订单”的所有缺失属性值都将设为默认值。
关键是你的'OrderSummary'(来自服务器)实际上只是一个字符串。 反序列化json字符串时没有强制输入。因此,您可以将“OrderSummary”对象映射到包含不同相同属性的所有类(使用公共setter)。
希望很清楚。