• 学习笔记03:资源塑性


    属性比较多,而我们只需要其中一部分属性使用资源塑形.可以提升性能

    三个方面:集合资源 单个资源 异常处理.

    常规:在Infrastructure项目 Extensions目录建立 EnumerableExtensions.cs(集合) ObjectExtensions(单个)数的处理.

    A.集合资源整形

    修改:PostController.cs

    var postResources = _mapper.Map<IEnumerable<Post>, IEnumerable<PostResource>>(postList);
    添加处理 postResources 的方法
    var result = postResources.ToDynamicIEnumerable(postParameters.Fields);
    
    并将原来返回
    return Ok(postResources);
    改为
    return Ok(result);

    然后测试:

    https://localhost:5001/api/posts?pageindex=0&pagesize=3&orderBy=id desc
    结果为
        {
            "Id": 9,
            "Title": "ddedsaf",
            "Body": "asdedd",
            "Author": "admin",
            "UpdaDateTime": "2019-02-21T10:21:28.8455374"
        },
        {
            "Id": 8,
            "Title": "Post Title 8",
            "Body": "Post Body 8",
            "Author": "Dave",
            "UpdaDateTime": "2019-02-20T21:01:17.0324478"
        },
    
    修改URL  
    https://localhost:5001/api/posts?pageindex=0&pagesize=3&orderBy=id desc&fields=id,title
    结果为:
        {
            "Id": 9,
            "Title": "ddedsaf"
        },
        {
            "Id": 8,
            "Title": "Post Title 8"
        },
        {
            "Id": 7,
            "Title": "Post Title 7"
        }

    B.单个资源整形

    1.http接收整形参数,默认为空
    原来
    public async Task<IActionResult> Get(int id)
    改为
    public async Task<IActionResult> Get(int id,string fields=null)
    
    2.对Resource结果进行整形
    原来
    var postResource = _mapper.Map<Post, PostResource>(post);
    增加:
    var shapedPostResource = postResource.ToDynamic(fields);
    
    3.返回结果处理
    原来
    return Ok(postResource);
    改为:
    return Ok(shapedPostResource);

    测试原结果不写了,调整后结果为:

    https://localhost:5001/api/posts/1?fields=id,title
    {
        "Id": 1,
        "Title": "Post Title 1"
    }

     上面,Id等字段的首字母变成了大写.处理成小写的办法如下

    在startup的 AddMvc后面修改
    原来:
                services.AddMvc();
    改为:
                services.AddMvc()
                    .AddJsonOptions(options =>
                    {
                        options.SerializerSettings.ContractResolver=new CamelCasePropertyNamesContractResolver();
                    });

    如果Url传的Fields参数在ResourceModel并不存在.这个处理办法如下.在Services下增加2个文件.ITypeHelperService.cs  和TypeHelperService.cs

    1.然后在Startup.cs注册这个service

    //注册资源塑性 Fields不存在的情况的处理方法
    services.AddTransient<ITypeHelperService, TypeHelperService>();

    2.在PostController.cs使用

    1.首先注入
    ITypeHelperService typeHelperService
    
    2.在get方法一开始就进行判断
                if (!_typeHelperService.TypeHasProperties<PostResource>(postParameters.Fields))
                {
                    return BadRequest("fields not exist");
                }

    单个资源的情况

                if (!_typeHelperService.TypeHasProperties<PostResource>(fields))
                {
                    return BadRequest("fields not exist");
                }

    测试:https://localhost:5001/api/posts?fields=id,sdf  

    sdf 这个属性就不存在,会提示相关信息.

    补充:昨天遗漏的今天补充

    排序的时间,postresource 和post的映射,也可能出现问题.(不存在或不可排序),进行类似的判断,

    先注入:IPropertyMappingContainer

                if (_propertyMappingContainer.ValidateMappingExistsFor<PostResource,Post>(postParameters.OrderBy))
                {
                    return BadRequest("can not finds fields for sorting");
                }
  • 相关阅读:
    MySql主从库配置
    Linux安装MySql5.6.43(亲测)
    Linux安装ffmpeg(亲测)
    Linux JDK安装(亲测)
    Linux磁盘挂载(亲测)
    Finance_CAPM&APT
    Python_QT_量化投资/量化交易 基础入门课
    581. Shortest Unsorted Continuous Subarray
    3. Longest Substring Without Repeating Characters
    239. Sliding Window Maximum
  • 原文地址:https://www.cnblogs.com/dxh0535/p/10417130.html
Copyright © 2020-2023  润新知