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相关的一些框架。
结束