在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持

我在前面随笔中介绍了在SqlSugar的开发框架中实现EAV模型(实体-属性-值)的处理,这个EAV模型实现的目的是支持弹性化的数据库设计,可以自由扩展数据库表字段和数据的查询和存储,实现的思路是在常规关系数据库中存储实体-属性-值的信息,而在非关系型数据库MongoDB数据库中存储自由字段的数据表集合,之前我们实现了在Winform界面端中对本地数据库和MongoDB数据库的处理操作,本篇随笔基于SqlSugar的开发框架的Web API实现过程,介绍对低代码EAV模型(实体-属性-值)的WebAPI实现支持。

1、SqlSugar开发框架的设计思路

SqlSugar的开发框架本身主要是基于常规关系型数据库设计的框架,支持多种数据库类型的接入,如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等数据库,非关系型数据库的MongoDB数据库也可以作为扩展整合到开发框架里面。

SqlSugar的开发框架本身设计是支持多终端的接入的,支持Winform、WPF、Vue3+ElementPlus、H5的APP应用等多终端的接入的,而Winform、WPF由于运行在客户端的,因此可以自由切换基于本地数据库还是Web API的服务接入,界面呈现效果一致。

对于数据的访问,我们设计开关变量模式来自由切换本地数据库模式或Web API的访问方式。如下所示。

2、EAV模型的设计思路

EAV模型(实体-属性-值)的处理,主要是用来解决动态定义业务表和数据存储和查询的解决方案,我们可以通过动态定义表和字段信息的方式,实现低代码甚至零代码的设计方案。

对于业务表,我们在系统中利用界面动态定义信息即可。如下面是产品信息表的定义界面,定义表和字段的相关信息即可。

然后通过配置菜单入口,给出了一个常规的数据录入管理界面,如下所示。

上面的字段录入,支持文本、数值、字典选择、单选框、复选框、日期、系统表选择(包括用户、角色、机构、定义表)、附件列表等内容的录入,基本覆盖了常规的需求,特殊需求进行一定的定制化处理即可。

而对于有些业务的主从表处理,如订单和订单明细,也可以通过配置的方式实现界面的自动处理。

动态化的数据,查询是其中一个难题,EAV模型(实体-属性-值)他的数据是根据不同的类型进行定义的,不会把所有的内容放在字符型的里面存储,因此保留了字段的原生类型,写入到MongoDB的非关系型数据库中,可以很好的支持各种复杂的查询处理。

由于我们的表字段是动态化构建的,因此查询字段就也就需要动态化了,我们把查询字段通过列表选择的方式,条件根据不同的数据类型,创建不同的输入控件来实现查询处理。

或者

通过下拉列表的方式选择不同的字段进行查询,如果是数值型或者日期,我们可以根据不同类型来创建输入控件组,来实现区间数值或者日期的输入。

有时候,为了方便,还提供了一个自定义条件查询的处理功能,可以自由组合多个条件进行数据的查询过滤。

我们参考了magento的eav模型设计图,对不同数据类型的内容进行了独立的存储。

由于实体类型(表定义)、实体字段属性、实体记录、字段复制映射关系、属性操作日志、删除日志等表联合构成了一个完整的裸条,如下所示。

如果我们MongoDB的数据记录移除了,还可以根据关系表的记录和属性值信息,进行MongoDB数据的同步记录处理,这样就可以还原MongoDB的数据记录了,如下所示。

3、基于WebAPI的支持实现

在SqlSugar开发框架中,我们是以接口来串起来整个应用的架构的,并且我们通过泛型基类的封装和集成,极大的减少常规代码的编写。

我们只需要在基类函数里面定义好相关的标准处理:如增、删、改、查、分页、导入、导出、排序等通用接口,以及针对不同业务模块,提供一个接口的扩展和实现即可,如下设计图所示。

一个良好的产品,可能往往需要支持多种数据库的接入,根据实际业务的需要进行调整,有时候可能需要2到3种数据库的支持。

SQLSugar的表和字段信息,都是通过特性描述的方式定义的,它们在不同的数据库是通用的,而我们要做的就是在启动的时候,加载不同的数据库连接字符串,进行初始化即可

而对应Web API的代理调用类,那么为了极大的重用常规的接口处理,我们需要类似的继承关系。

对于BS的前端和移动端,我们根据框架后端的接口进行前端JS端的类的封装处理,引入了ES6类的概念实现业务基类接口的统一封装,简化代码。

这样不管对于终端的调用(Vue3的TS客户端、WInform端、WPF端、Python前端后端)都是以一定的基类抽象的方式,尽可能的封装相同逻辑接口的实现,通过泛型类的引入,可以非常弹性化接口的实现处理。

我们根据接口的定义,分别实现WebAPI的控制器实现部分,以及ApiCaller的客户端调用的封装处理部分,如下所示。

Web API的部分如下所示。

Web API部分的路由是Restful的格式命名,然后根据实际的接口定义参数入口即可,如果是复杂实体对象的传递,一般用POST方式。

Web API的ApiCaller调用封装类,主要就是调用基类实现数据的调用和解析处理即可。如对于字段属性的ApiCaller的接口调用封装,如下所示。

主要就是根据Web API的路由名称和参数,以及请求方式的处理即可。

由于Winform或者WPF的调用是基于接口的处理方式,它实际的调用是根据开关变量的参数配置进行选择的。

复制代码
            //根据条件获取分页记录或者全部记录
            var result = await BLLFactory<IAttributeService>.Instance.MongoGetList(pageDto);
            var dataTable = result.Items;
            if (pageDto.IsPaging)
            {
                this.pager1.PagerInfo.RecordCount = result.TotalCount;//记录总行数
            }

因此在Winform端或者WPF端,我们开发代码的时候,不用管它来自哪里,都是统一的模型调用处理。

以上就是我们SqlSugar开发框架的多接入方式、多端接入的实现思路,以及EAV实体属性值模式实现数据的弹性化定义以及查询、存储的处理。

相关推荐
三天不学习2 个月前
【并发控制、更新、版本控制】.NET开源ORM框架 SqlSugar 系列
开源·.net·orm·sqlsugar
三天不学习3 个月前
【Delete 删除数据语法合集】.NET开源ORM框架 SqlSugar 系列
后端·开源·.net·orm·微软技术·sqlsugar
三天不学习3 个月前
【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列
数据库·后端·c#·.net·orm·sqlsugar
梁萌3 个月前
SqlSugar-文章目录
orm·sqlsugar
三天不学习4 个月前
【SqlSugar雪花ID常见问题】.NET开源ORM框架 SqlSugar 系列
sql·.net·数据·sqlsugar·雪花id
三天不学习4 个月前
【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列
数据库·.net·orm·微软技术·sqlsugar
三天不学习4 个月前
【过滤器】.NET开源 ORM 框架 SqlSugar 系列
后端·c#·.net·orm·sqlsugar
三天不学习5 个月前
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
数据库·.net·orm·sqlsugar
三天不学习5 个月前
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
数据库·开源·orm·sqlsugar