package svc import ( "chat/internal/config" domainRepo "chat/internal/domain/repository" domainUsecase "chat/internal/domain/usecase" "chat/internal/library/cassandra" "chat/internal/library/centrifugo" "chat/internal/middleware" repoImpl "chat/internal/repository" usecaseImpl "chat/internal/usecase" "context" "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/rest" ) type ServiceContext struct { Config config.Config AnonMiddleware rest.Middleware // Clients RedisClient *redis.Client CentrifugoClient *centrifugo.Client CassandraDB *cassandra.DB // Repositories MatchmakingRepo domainRepo.MatchmakingRepository MessageRepo domainRepo.MessageRepository // UseCases AuthUseCase domainUsecase.AuthUseCase MatchmakingUseCase domainUsecase.MatchmakingUseCase MessageUseCase domainUsecase.MessageUseCase } func NewServiceContext(c config.Config) *ServiceContext { ctx := context.Background() redis, err := initRedis(ctx, c.Redis) if err != nil { panic(err) } cassandraDB, err := initCassandra(ctx, c.Cassandra) if err != nil { panic(err) } centrifugoClient := initCentrifugo(c.Centrifugo) // 初始化 Repositories // 初始化 Repositories matchmakingRepo := repoImpl.NewMatchmakingRepository(redis) messageRepo, err := repoImpl.NewMessageRepository(cassandraDB, c.Cassandra.Keyspace) if err != nil { logx.Errorf("Failed to create message repository: %v", err) } // 初始化 UseCases // AuthUseCase 需要 MatchmakingRepository 來查詢使用者所在的房間 authUseCase := usecaseImpl.NewAuthUseCase(c.JWT.Secret, c.JWT.Expire, c.JWT.CentrifugoSecret, matchmakingRepo) matchmakingUseCase := usecaseImpl.NewMatchmakingUseCase(matchmakingRepo) messageUseCase := usecaseImpl.NewMessageUseCase(messageRepo, matchmakingRepo, centrifugoClient) return &ServiceContext{ Config: c, AnonMiddleware: middleware.NewAnonMiddleware(c).Handle, RedisClient: redis, CentrifugoClient: centrifugoClient, CassandraDB: cassandraDB, MatchmakingRepo: matchmakingRepo, MessageRepo: messageRepo, AuthUseCase: authUseCase, MatchmakingUseCase: matchmakingUseCase, MessageUseCase: messageUseCase, } }