xamarin表单视图模型和后端响应之间的映射

时间:2018-05-16 22:25:03

标签: c# json xamarin.forms

我在

跟踪了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;   }

代码有效。只是想了解如何。

1 个答案:

答案 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)。

希望很清楚。