- 背景
最近在WebAPI项目中需要实现操作留痕的功能, 差不多就是操作日志。最开始设定的目标是:需要能够查询到哪个人对哪个功能模块(可以用control表达)的哪个方法进行了哪些修改(也即是需要对操作后的新数据进行记录), 其它部分都好办, 可以通过WebAPI的Filter进行OAP进行切面调用, 但在对新数据进行记录的时候遇到些麻烦, 因为从最后留痕界面段操作的时候使用的是字段名进行查询, 而传入进来的数据是用面向对象的方式组织的里面存在继承、包含等关系还存在各种类型, 那么怎么才能把这种对象结构映射成键值对的方式?在这里那么就需要通过反射对对象结构进行解析,但对于不同的类型又会有不同的解析方式,比如说:如果碰到的是int/double 等基元类型可以直接获取到字段名、字段值来形成键值对, 而对于类类型、结构体需要通过反射出里面的字段名、字段值, 而如果在类类型中包含了List/Array 等集合的话还得对列表里面所包含的类型再次进行解析, 如果应对的是枚举呢又改怎么办呢? 这种解析的范式就类似于对象的序列化、反序列化,在WebApi中同样存在类似的情景就是模型的绑定和返回, 如果能弄明白模型的绑定和返回的话以上的问题就好解决了, 下面就专注考虑下WebAPI中模型的绑定是怎么做的?
- Web.API 模型绑定
大家都知道在WebAPI中当前段调用一个Http Request的时候里面会带入参数, 然后通过Http管道和路由机制最后可以找到相对应的Control 和 Action, 那么接下来所需要做的主要有两件事:
1、参数验证
2、把数据绑定到Action所对应的参数列表上(模型绑定)
接下来将主要看看模型绑定实现思路是怎么样?
下面是我对模型绑定研究过程:
-
- 从GitHub上下载WebAPI源代码,链接: https://github.com/aspnet/Mvc
- 找到模型绑定相关模块,如下图:
在WebAPI中主要是通过 ModelBinding 这块代码进行实现
-
- 类图
利用Enterprise Architect(EA)对源代码逆向分析生成相应的类图结构,如下图:
图中只是部分类图, 为了能理清思路, 从部分入手, 假设一种情景从Http中通过Body传递对象到Action中,对于对象怎么解析呢?
-
- 逻辑流程
- 扩展点
- 解决方案
- 设计层面
- 类图
- 时序图
- 代码Demo