package data import ( "context" "ky-go-kratos/app/ucenter/internal/conf" "ky-go-kratos/app/ucenter/internal/data/ent" "ky-go-kratos/pkg/database" "github.com/go-kratos/kratos/v2/log" "github.com/google/wire" "github.com/redis/go-redis/v9" "go.mongodb.org/mongo-driver/mongo" ) var ProviderSet = wire.NewSet(NewData, NewUserRepo) type Data struct { // TODO wrapped database client Redis *redis.Client // 通用缓存 Session *redis.Client // 会话 Queue *redis.Client // 队列 Lock *redis.Client // 分布式锁 Task *redis.Client // 任务调度/异步处理 Mongo *mongo.Database // MongoDB Ent *ent.Client // Mysql } // NewData func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) { logHelper := log.NewHelper(logger) // Redis RedisClient := database.NewRedis(c.Redis.Source, 0) SessionClient := database.NewRedis(c.Redis.Source, 1) QueueClient := database.NewRedis(c.Redis.Source, 2) LockClient := database.NewRedis(c.Redis.Source, 3) TaskClient := database.NewRedis(c.Redis.Source, 4) // MongoDB mongoClient := database.NewMongoDB(c.Mongodb.Uri, c.Mongodb.Db) // MySQL db := database.OpenMysql(c.Database.Source) entClient := ent.NewClient(ent.Driver(db)) // 创建数据库表结构 if err := entClient.Schema.Create(context.Background()); err != nil { logHelper.Errorf("failed to close ent client: %v", err) } cleanup := func() { log.NewHelper(logger).Info("closing the data resources") // 关闭 Redis 客户端 if err := RedisClient.Close(); err != nil { logHelper.Errorf("failed to close redis client: %v", err) } if err := SessionClient.Close(); err != nil { logHelper.Errorf("failed to close redis client: %v", err) } if err := QueueClient.Close(); err != nil { logHelper.Errorf("failed to close redis client: %v", err) } if err := LockClient.Close(); err != nil { logHelper.Errorf("failed to close redis client: %v", err) } if err := TaskClient.Close(); err != nil { logHelper.Errorf("failed to close redis client: %v", err) } // 关闭 MongoDB 连接 if err := mongoClient.Client().Disconnect(context.Background()); err != nil { logHelper.Errorf("failed to close mongodb connection: %v", err) } // 关闭 Ent 客户端 if err := entClient.Close(); err != nil { logHelper.Errorf("failed to close ent client: %v", err) } } return &Data{ Redis: RedisClient, Session: SessionClient, Queue: QueueClient, Lock: LockClient, Task: TaskClient, Mongo: mongoClient, Ent: entClient, }, cleanup, nil }