属性比较多,而我们只需要其中一部分属性使用资源塑形.可以提升性能
三个方面:集合资源 单个资源 异常处理.
常规:在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"); }