当前位置: 首页 > news >正文

Godi baseentity等实现原理

godi 框架中 BaseEntity 等核心组件的实现原理和架构设计:
让我再搜索一些关于 godi 框架更详细的架构实现和核心组件信息:
根据搜索结果,我来为您详细解析 leijmdas godi 框架中 BaseEntity 及相关核心组件的实现原理:
godi BaseEntity 架构设计
1. 核心组件结构
godi 框架采用分层设计,BaseEntity 不是孤立的实体类,而是与依赖注入容器深度整合的智能实体基类:
┌─────────────────────────────────────────┐
│ 业务实体 (User/Order等) │
│ type User struct { │
│ basedto.BaseEntity │
│ basedto.Gometa `gometa:"autowired:true"` │
│ Username string │
│ } │
├─────────────────────────────────────────┤
│ 元数据层 (Gometa) │
│ - 自动注入开关控制 │
│ - 标签解析 (ParseTags) │
│ - 反射元数据缓存 │
├─────────────────────────────────────────┤
│ 实体基类 (BaseEntity) │
│ - 通用字段 (ID, CreateTime等) │
│ - 生命周期回调 │
│ - 软删除逻辑 │
├─────────────────────────────────────────┤
│ 注入能力层 (IbaseProxy) │
│ - InitProxy() 初始化代理 │
│ - Autowire() 自动装配 │
│ - IfAutowire() 是否自动注入判断 │
└─────────────────────────────────────────┘

2. BaseEntity 实现原理
2.1 结构体嵌入设计(Go 组合模式)
// 来自 basedto 包的核心定义
type BaseEntity struct {
// 通用审计字段
Id uint64 `json:"id"`
CreateTime time.Time `json:"create_time"`
UpdateTime time.Time `json:"update_time"`
CreateBy string `json:"create_by"`
UpdateBy string `json:"update_by"`
IsDeleted bool `json:"is_deleted"` // 软删除标志
}

// 元数据控制结构
type Gometa struct {
// 通过标签控制自动注入行为
Autowired bool // 是否启用自动注入
}

关键机制:通过 Go 的结构体嵌入(Embedding),业务实体同时获得 BaseEntity 的数据字段和 Gometa 的控制能力 。
2.2 自动注入触发机制
// 容器创建 Bean 时的完整流程
func (this *BeanInfo) CreateBean() baseiface.ISingleton {
var single = this.loadBean() // 1. 实例化
single.InitProxy(single) // 2. 初始化代理
if single.IfAutowire() { // 3. 检查是否需要注入
single.Autowire() // 4. 执行自动注入
}
return single
}

注入策略通过结构体标签定义:
- godi:"auto" → 从容器查找已注册的 Bean
- godi:"bind" → 通过绑定函数注入
- godi:"new" → 每次新建实例
- godi:"single" → 简单 new 单例
- godi:"none" → 跳过注入
3. 核心能力实现细节
3.1 ParseTags - 标签解析引擎
func (this *TestBeanSuite) Test009_Parsetags() {
var stru = basedi.FindBeanGeneral[*Stru]()
var tags = stru.ParseTags("godi") // 解析 godi 标签
// 输出: {"Dto": "autowired:true"}
}

实现原理:使用 Go 的 reflect 包遍历结构体字段,提取指定 tag 的键值对,构建注入映射表 。
3.2 ContainType - 类型检测
用于判断结构体是否包含特定类型,支持嵌套结构体递归检测:
- 检测循环依赖(S1 *Stru 指向自身类型)
- 验证注入类型兼容性
3.3 Autowire - 自动装配核心
func (this *Stru) Autowire() {
// 1. 解析所有带 `godi:` 标签的字段
// 2. 根据策略从容器获取实例
// 3. 反射赋值给对应字段
// 4. 处理嵌套结构体(递归注入)
}

递归注入示例:
type Stru struct {
basedto.Gometa `gometa:"autowired:true"`
basedto.BaseEntity
S1 *Stru // 自引用,支持递归注入
S2 *Stru
Dto baseconfig.DbClientDto `godi:"autowired:true"`
}

4. 代码生成机制
godi all 命令生成的代码结构 :
// 生成的注册文件: simple_entity_init.go
const singleNameSimpleEntity = "*single.SimpleEntity-de989ab9b2ac440ea3d15874c5a9eeee"

func init() {
registerBeanSimpleEntity()
}

func LoadSimpleEntity() baseiface.ISingleton {
var s = NewSimpleEntity()
InjectSimpleEntity(s) // 注入逻辑
return s
}

func InjectSimpleEntity(s *SimpleEntity) {
// tag `godi:"auto"`
s.MultiAuto = multi.FindBeanMultiEntity()
// tag `godi:"new"`
s.MultiNew = multi.NewMultiEntity()
// tag `godi:"bind"` 通过绑定函数
s.Bind()
if find := s.FindBinding("MultiBind"); find != nil {
s.MultiBind = find().(*multi.MultiEntity)
}
}

5. 与 goconfig 的协同
在 gowater 全家桶中,BaseEntity 与配置框架深度集成 :
type SimpleEntity struct {
basedto.BaseEntitySingle // 单例模式基类
MultiAuto *multi.MultiEntity `godi:"auto"`
}

func (this *SimpleEntity) Bind() {
this.BindUp("MultiBind", multi.LoadMultiEntity) // 绑定加载函数
}
func (*SimpleEntity) Autoload() bool { return true } // 自动注册
func (*SimpleEntity) AutoInject() bool { return true } // 自动注入

6. 对比传统 ORM 的 BaseEntity
特性 godi BaseEntity 传统 ORM (GORM/Ent)
核心职责 依赖注入容器 + 实体数据 仅数据映射
字段注入 运行时通过容器解析 数据库标签映射
生命周期 InitProxy → Autowire 回调 BeforeCreate/AfterFind 等钩子
代码生成 生成 DI 注册代码 生成数据库访问代码
软删除 内置 IsDeleted + 查询过滤 需手动配置或插件
7. 工业级特性
1. 循环依赖检测:通过 ContainType 检测自引用结构体
2. 线程安全:BeanInfo 的创建过程使用容器级锁
3. 类型安全:泛型约束 FindBeanGeneral[T baseiface.IbaseProxy]() 确保编译期检查
4. 零反射注入:生成的注入代码直接赋值,避免运行时反射开销
这种设计让 BaseEntity 不仅是数据载体,更是依赖注入的参与者和协调者,实现了类似 Spring Data JPA 中 @Entity + @Autowired 的组合效果,但更贴合 Go 的语法特性。

http://www.jsqmd.com/news/511858/

相关文章:

  • OpenAI 打造桌面超级应用,能否打破 AI 工具使用困局?
  • 中望3D2026 工程图:三维点坐标统计表的标准流程
  • MySQL事务隔离级别
  • 杭州正规的税务合规服务公司费用大概多少钱 - 工业品网
  • Matlab Simulink下直驱永磁风电机组并网仿真模型详解:双PWM变流器控制策略及详细...
  • SPSS岭回归实战:从语法调用到结果解读全流程解析
  • 想通过gometa实现通用excel导出工具
  • 类目竞争加剧如何找到细分需求切入点
  • 解读高新企业代理记账机构,推荐几家杭州值得选的 - 工业品牌热点
  • 美胸-年美-造相Z-Turbo入门秘籍:写好描述词,让AI听懂你的想法
  • 中国地形地势分布+地貌矢量数据shp
  • 时域信道估计和时域信道均衡以及matlab代码手搓(注意是时域,后续讲ofdm相关的频域信道估计和均衡)
  • 聊聊2026年金杉木双筋直拼板ENF级板材厂家,哪家性价比高 - myqiye
  • 用Three.js+OrbitControls打造可旋转的3D中国地图:新手避坑指南
  • 百考通:AI赋能实践报告,智能生成优质内容,让实习总结高效又专业
  • 字符编码:从基础到实战的核心解析
  • 基于企微API与CRM对接,构建试听后的自动化跟进与转化SOP
  • 苹果 M5 系列 MacBook 发布,升级与选择的深度剖析
  • 讲讲甘肃万通汽修教育网址和学校地址,学新能源汽车价格如何 - mypinpai
  • 当大事件突然降临,普通人的第一反应往往是懵的
  • 【无人售货柜・RK+YOLO】篇 4:效果拉满!针对无人售货柜场景的 YOLO 模型优化技巧,解决 90% 的识别问题
  • Ant Table隐藏技巧:用reduce+sticky实现财务系统级合计行
  • 基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型在Matlab S...
  • BrowseComp-ZH:中文网络生态下大模型检索能力的极限挑战
  • 思阳GEO思考:3步破解搜索痛点,抢占AI优先推荐
  • Face Analysis WebUI模型安全防护策略
  • 【无人售货柜・RK+YOLO】篇 5:RK3576 部署第一步!YOLO 模型转 RKNN 全流程,新手必避的量化大坑
  • Perplexity+NotebookLM=天才
  • 双碳目标下的能耗监测大屏:企业通用
  • Vue3 + Vxe-Table 实战:手把手教你实现可编辑表格的实时合计与平均(附完整代码)