文章目录
GoFrame DAO 结构深度解析
1. 核心结构体定义
1.1 AiDictDao
- 基础DAO结构体
type AiDictDao struct {
table string // 数据库表名
group string // 数据库配置组名(用于多数据库配置)
columns AiDictColumns // 表字段映射
}
作用:
- 作为最底层的数据库访问对象
- 持有表结构元数据
- 通过
NewAiDictDao()
工厂方法创建实例
字段详解:
table
: 对应数据库表名ai_dict
group
: 数据库配置组,空字符串表示默认配置columns
: 字段映射(如Id
,DictName
等)
2. 初始化与单例模式
2.1 NewAiDictDao()
- 工厂方法
func NewAiDictDao() *AiDictDao {
return &AiDictDao{
group: "",
table: "ai_dict",
columns: aiDictColumns,
}
}
特点:
- 返回初始化好的DAO实例
- 硬编码表名和字段映射
- 使用空
group
表示默认数据库连接
3. 类型定义与嵌套
3.1 internalAiDictDao
- 类型别名
type internalAiDictDao = *internal.AiDictDao
作用:
- 创建指向内部DAO的指针类型别名
- 简化类型引用
- 隐藏具体实现细节
3.2 aiDictDao
- 外层包装结构体
type aiDictDao struct {
internalAiDictDao
}
设计特点:
- 使用结构体嵌入(embedding)而非继承
- 自动获取所有内部DAO的方法
- 注释明确提示可以在此扩展功能
4. 单例实例
4.1 全局单例 AiDict
var (
AiDict = aiDictDao{
internal.NewAiDictDao(),
}
)
关键点:
- 包级变量,程序启动即初始化
- 组合了内部DAO实现
- 通过
dao.AiDict
全局访问 - 真正的单例核心
5. 接口与扩展层
5.1 接口版本单例 AiDictDao
var AiDictDao IAiDict = &aiDictDaoExtend{
AiDict,
}
组成要素:
IAiDict
: 接口类型(未展示定义)aiDictDaoExtend
: 扩展实现结构体- 注入基础单例
AiDict
5.2 扩展结构体 aiDictDaoExtend
type aiDictDaoExtend struct {
aiDictDao
}
func (a *aiDictDaoExtend) GetDicts(ctx context.Context, dictType rpc.AiDictType,
name string, pageSize int, pageNum int) (total int, dicts []*entity.AiDictView, err error) {
// 实现细节...
}
扩展能力:
- 添加新方法(
GetDicts
) - 可以重写嵌入的方法
- 实现接口约束
6. 完整类型关系图
7. 各组件职责划分
组件 | 职责 | 是否可修改 | 生命周期 |
---|---|---|---|
AiDictDao | 基础数据访问 | 禁止修改 | 长期 |
aiDictDao | 方法继承桥接 | 不建议改 | 长期 |
aiDictDaoExtend | 业务逻辑扩展 | 可自由扩展 | 长期 |
AiDict | 基础单例 | 不建议改 | 长期 |
AiDictDao (var) | 接口单例 | 可替换实现 | 长期 |
8. 典型调用链示例
// 1. 基础查询
dao.AiDict.Ctx(ctx).Where("status", 1).All()
// 2. 扩展方法查询
total, items, err := dao.AiDictDao.GetDicts(ctx, rpc.TypeA, "", 10, 1)
// 3. 事务操作
dao.AiDict.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
// 使用tx进行操作
})
9. 设计模式应用
- 单例模式:通过包级变量保证唯一实例
- 装饰器模式:
aiDictDaoExtend
包装基础功能 - 依赖注入:将基础DAO注入到扩展结构中
- 接口隔离:通过
IAiDict
抽象访问方式