学习笔记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");
            }
原文地址:https://www.cnblogs.com/dxh0535/p/10417130.html