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:idCreateTime time.Time json:create_timeUpdateTime time.Time json:update_timeCreateBy string json:create_byUpdateBy string json:update_byIsDeleted 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:truebasedto.BaseEntityS1 *Stru // 自引用支持递归注入S2 *StruDto baseconfig.DbClientDto godi:autowired:true}4. 代码生成机制godi all 命令生成的代码结构 // 生成的注册文件: simple_entity_init.goconst singleNameSimpleEntity *single.SimpleEntity-de989ab9b2ac440ea3d15874c5a9eeeefunc init() {registerBeanSimpleEntity()}func LoadSimpleEntity() baseiface.ISingleton {var s NewSimpleEntity()InjectSimpleEntity(s) // 注入逻辑return s}func InjectSimpleEntity(s *SimpleEntity) {// tag godi:autos.MultiAuto multi.FindBeanMultiEntity()// tag godi:news.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.coloradmin.cn/o/2433405.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!