多级泛型接口嵌套
多级泛型接口嵌套的设计模式从基础到业务逐层扩展---层级设计IBaseDao[T] // 最基础单实体 CRUD↑IGeneralDao[T, R] // 通用层实体 返回类型分离↑IBusinessDao[T, Q, R] // 业务层实体 查询条件 返回↑UserDao // 具体实现---第一层IBaseDao[T]// 基础 CRUDT 实体类型type IBaseDao[T any] interface {Insert(entity T) errorUpdateById(id int64, entity T) errorDeleteById(id int64) errorFindById(id int64) (T, error)FindAll() ([]T, error)}---第二层IGeneralDao[T, R]// 通用查询T 实体R 返回类型DTO/VOtype IGeneralDao[T any, R any] interface {IBaseDao[T] // 嵌入基础接口// 分页查询QueryPage(req *pagemodel.PageRequest[T]) *pagemodel.PageResult[R]QueryOne(req T) (*R, error)// 转换器可选SetConverter(conv pagemodel.Converter[T, R])}---第三层IBusinessDao[T, Q, R]// 业务层T 实体Q 查询条件R 返回type IBusinessDao[T any, Q any, R any] interface {IGeneralDao[T, R] // 嵌入通用接口// 复杂业务查询QueryByCondition(req Q) *pagemodel.PageResult[R]QueryByConditionOne(req Q) (*R, error)// 统计CountByCondition(req Q) (int64, error)// 批量操作BatchInsert(entities []T) errorBatchUpdate(entities []T) error}---具体实现// 实体type User struct {ID int64Name stringAge int}// 查询条件type UserQuery struct {NameLike stringAgeMin intAgeMax int}// 返回 DTOtype UserDTO struct {ID string json:idName string json:nameAge int json:age}// 基础 DAO 实现 type BaseDao[T any] struct {DB *gorm.DB}func (d *BaseDao[T]) Insert(entity T) error {return d.DB.Create(entity).Error}func (d *BaseDao[T]) FindById(id int64) (T, error) {var t Terr : d.DB.First(t, id).Errorreturn t, err}// ... 其他基础方法// 通用 DAO 实现 type GeneralDao[T any, R any] struct {BaseDao[T]conv pagemodel.Converter[T, R]}func (d *GeneralDao[T, R]) QueryPage(req *pagemodel.PageRequest[T]) *pagemodel.PageResult[R] {var list []Tvar total int64db : d.DB.Model(new(T))// ... 构建查询db.Count(total)db.Offset((req.PageCurrent - 1) * req.PageSize).Limit(req.PageSize).Find(list)// 转换result : pagemodel.PageResult[T]{PageResult: page.PageResult{Total: total,PageCurrent: req.PageCurrent,PageSize: req.PageSize,},Data: list,}return pagemodel.PageTo(result, d.conv)}func (d *GeneralDao[T, R]) SetConverter(conv pagemodel.Converter[T, R]) {d.conv conv}// 业务 DAO 实现 type UserDao struct {GeneralDao[User, UserDTO] // 嵌入通用实现}// 实现业务层特有方法func (d *UserDao) QueryByCondition(req UserQuery) *pagemodel.PageResult[UserDTO] {db : d.DB.Model(User{})if req.NameLike ! {db db.Where(name LIKE ?, %req.NameLike%)}if req.AgeMin 0 {db db.Where(age ?, req.AgeMin)}if req.AgeMax 0 {db db.Where(age ?, req.AgeMax)}var list []Uservar total int64db.Count(total).Find(list)result : pagemodel.PageResult[User]{PageResult: page.PageResult{Total: total},Data: list,}return pagemodel.PageTo(result, d.conv)}func (d *UserDao) CountByCondition(req UserQuery) (int64, error) {var count int64db : d.DB.Model(User{})// ... 条件构建err : db.Count(count).Errorreturn count, err}---使用方式// 创建 DAOuserDao : UserDao{GeneralDao: GeneralDao[User, UserDTO]{BaseDao: BaseDao[User]{DB: db},conv: pagemodel.Converter[User, UserDTO]{},},}// 基础 CRUD来自 IBaseDaouser, err : userDao.FindById(1)// 通用查询来自 IGeneralDaoresult : userDao.QueryPage(pagemodel.PageRequest[User]{PageCurrent: 1,PageSize: 10,})// 业务查询来自 IBusinessDaodtoResult : userDao.QueryByCondition(UserQuery{NameLike: 张,AgeMin: 18,AgeMax: 30,})---接口断言与多态// 按层级使用接口var base IBaseDao[User] userDaovar general IGeneralDao[User, UserDTO] userDaovar business IBusinessDao[User, UserQuery, UserDTO] userDao// 函数接受不同层级接口func UseBase[T any](dao IBaseDao[T]) { ... }func UseGeneral[T, R any](dao IGeneralDao[T, R]) { ... }func UseBusiness[T, Q, R any](dao IBusinessDao[T, Q, R]) { ... }// 调用UseBase(userDao)UseGeneral(userDao)UseBusiness(userDao)---依赖注入godi 风格// 注册到容器godi.Register(IBusinessDao[User, UserQuery, UserDTO], func() any {return UserDao{GeneralDao: GeneralDao[User, UserDTO]{BaseDao: BaseDao[User]{DB: godi.Get(*gorm.DB)},conv: pagemodel.Converter[User, UserDTO]{},},}})// 使用var userDao godi.Get(IBusinessDao[User, UserQuery, UserDTO])result : userDao.QueryByCondition(query)---设计要点总结层级 泛型参数 职责 复用方式IBaseDao[T] 1个 基础 CRUD 嵌入IGeneralDao[T, R] 2个 分页 转换 嵌入 ConverterIBusinessDao[T, Q, R] 3个 复杂业务查询 业务实现关键技巧- 上层接口嵌入下层接口- 实现结构体嵌入上层实现- Converter[T, R] 解耦实体与 DTO- 泛型参数逐层增加不破坏已有代码
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2581965.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!