在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
笔记哥 /
04-23 /
43点赞 /
0评论 /
867阅读
### 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](https://github.com/magento/magento2)的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的调用是基于接口的处理方式,它实际的调用是根据开关变量的参数配置进行选择的。
```csharp
//根据条件获取分页记录或者全部记录
var result = await BLLFactory.Instance.MongoGetList(pageDto);
var dataTable = result.Items;
if (pageDto.IsPaging)
{
this.pager1.PagerInfo.RecordCount = result.TotalCount;//记录总行数
}
```
因此在Winform端或者WPF端,我们开发代码的时候,不用管它来自哪里,都是统一的模型调用处理。
以上就是我们SqlSugar开发框架的多接入方式、多端接入的实现思路,以及EAV实体属性值模式实现数据的弹性化定义以及查询、存储的处理。
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/2506
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利