基础开发
# 后端插件开发
# 上下文定义
请勿删除GwDbContext,保持默认继承GwDbContext,该上下文里面包含操作底层数据模型,比如产品表、设备表、遥测表、遥信等。
重写OnModelCreating方法,请勿删除base.OnModelCreating(modelBuilder)。
注意
- 禁止定义联合主键,也不推荐使用外键
- 鉴于不同数据库对于大小写敏感,强烈建议统一映射为小写
- 若无特殊情况,强烈建议使用EF Core注解方式即DataAnnotation
- 约定规范:插件名称后缀+DbContext,例如我们创建的Ganweisoft.IoTCenter.Module.UserDemo插件,则上下文名称定义为UserDemoDbContext。
# 跨插件模型操作说明
因我们保持模型独立于插件,如此插件与插件之间完全解耦而无依赖,但我们仍存在需操作其他插件模型的可能,故提供此场景解决方案。将需跨插件操作的模型放于Dto文件夹,且命名规范约定:[类名]+Dto,我们增加了对插件上下文的扩展方法来直接操作跨插件模型。
- 查询IoTDbSet<T>。
- 新增(IoTAdd、IoTAddAsync、IoTAddRange、IoTAddRangeAsync。
- 修改(IoTUpdate、IoTUpdateAsync、IoTUpdateRange、IoTUpdateRangeAsync)。
- 删除(IoTRemove、IoTRemoveAsync、IoTRemoveRange、IoTRemoveRangeAsync)。
注意
- 模型根据规范约定命名后必须加上所操作映射表即表特性,例如
- 新增、修改、删除扩展方法内部直接会SaveChanges或SaveChangesAsync,返回的结果为受影响的行
# 服务接口定义
响应数据结构必须通过底层暴露的OperateResult包裹并返回,将操作实体进行DTO映射转换,DTO模型存放于Models目录,命名规范约定:[类名]+Model。
# 服务接口实现
通过构造函数注入的上下文直接操作数据库模型。
添加、删除、查询、更新常规基本操作,比如如下添加,AddAsync
方法在基类中已有实现。
# 注册仓储和上下文
在Startup
类文件中注册服务以及EntityFramework Core上下文。
# 控制器继承
IoT平台使用JWT或Cookie认证授权,所有定义控制器必须继承DefaultController,否则当访问接口时会抛异常或401,通过构造函数使用注册的服务接口,另外请求方式建议遵循RESTful风格。
# 测试验证
在
\IoTCenter\IoTCenterWeb\publish\plugins
目录下创建以项目名称命名的文件夹,并将项目生成的dll和json文件复制到文件夹中。然后启动WebAPi服务并访问Web。访问健康接口api/user/health验证插件是否能正常加载。
若需调试接口,将其附加到WebAPi服务进程即可。
接口调试工具
通过正确的账号和密码成功登录IoTCenter平台,浏览器F12查看任意非匿名接口,然后复制请求头中的Cookie信息。
比如我们测试添加用户接口
# 扩展插件安装
提供VisualStudio扩展插件自动解析依赖并发布,具体请下载 (opens new window)并参看扩展插件安装使用说明。