P39 数据塑形



只返回需要的字段。字段指的是dto上面的字段。你不是entity上的字段。

写代码

这里的返回类型实际上是 IEnumerable<T>类型的。这样就会把ComapnyDto上面的字段都返回回去。想要做数据塑性,就不能返回具体的类型。因为具体的类型字段都是死的。我们应该返回什么呢 ExpandObject类型的 ExpandObject里面的属性是动态的。

扩展方法

还是使用一个扩展方法。




判断非空,new一个List的ExpandObject

如果大小固定的话,可以把大小也写上。

那么怎么通过字段名返回响应的属性值呢?这个时候就肯定需要用到反射。而反射呢,比较消耗资源。

首先争对这个类型,把它所有的属性都提取出来。然后重复利用这个结果就可以了。 而不必循环的时候针对每个实例再走一遍这个反射操作。
 
如果传入的fields为空,就表示返回所有的属性

那么getProperties获取什么类型的属性呢?首先是public的,另外还是实例的instance


然后就是加上这些属性

单独处理

属性都是逗号分隔开的
通过反射取出propertyInfo。用typeof().GetProperty首先参数是属性的名称,然后是 忽略大小写。

然后必须是public的,然后必须是实例上面的





有了数据之后就循环数据

ExpandObject实际上就是一个Dictionary。下面这样就可以把属性名和属性值添加到ExpandObject里面了。

添加到list里面,然后返回这个list

controller里面处理

首先加一个字段属性

这是我们目前的返回类型。

这里换成IActionResult

最后用shapeData

然后还需要考虑到分页

测试

先只取一个id

加上companyName

获取单个资源的情况-数据塑形












分开两个扩展方法是处于性能的考虑

测试



没有的属性

这是客户端引起的错误,应该由返回4开头的错误。

再封装一个service


想要导出复用它就把它封装成一个接口,注入到DI容器。




startUp注册

构造函数注入


判断字段是否存在

获取单个资源的action

测试不存在的字段。

其他功能




包含子资源的把子资源也一块取出来


只取子资源的id

这个字段companyName包含 dave这个字符串的。


可以参考的微软的OData,它是完全实现restful风格架构的基础以上又添加了很多高级的功能,包裹高级的查询,数据塑性等等。

以上讲的是完全自己手动实现的数据塑性。如果项目想使用一个现成的完全使用restful架构风格的api,就可以使用微软的OData相关的一些框架。
 

结束

 

posted @ 2020-12-14 12:53  高山-景行  阅读(170)  评论(0编辑  收藏  举报