Files
go-common/docs/factory.md
2025-11-30 13:50:28 +08:00

7.3 KiB
Raw Blame History

工厂工具文档

概述

工厂工具提供了从配置直接创建已初始化的客户端对象的功能,避免调用方重复实现创建逻辑。

功能特性

  • 从配置直接创建已初始化的客户端对象
  • 统一的工厂接口
  • 避免调用方重复实现创建逻辑

使用方法

1. 从配置文件直接创建工厂(推荐)

import "git.toowon.com/jimmy/go-common/factory"

// 直接传入配置文件路径,自动加载配置并创建工厂
fac, err := factory.NewFactoryFromFile("./config.json")
if err != nil {
    log.Fatal(err)
}

// 直接获取已初始化的对象
db, _ := fac.GetDatabase()        // 直接获取数据库对象
logger, _ := fac.GetLogger()      // 直接获取日志对象
emailClient, _ := fac.GetEmailClient()  // 直接获取邮件客户端

2. 从配置对象创建工厂

import (
    "git.toowon.com/jimmy/go-common/config"
    "git.toowon.com/jimmy/go-common/factory"
)

// 加载配置
cfg, err := config.LoadFromFile("./config.json")
if err != nil {
    log.Fatal(err)
}

// 创建工厂实例
fac := factory.NewFactory(cfg)

3. 获取数据库对象(已初始化,推荐)

// 直接获取已初始化的数据库对象(*gorm.DB
db, err := fac.GetDatabase()
if err != nil {
    log.Fatal(err)
}

// 直接使用,无需再创建连接
var users []User
db.Find(&users)
db.Create(&user)

4. 获取Redis配置

// 获取Redis配置用于创建Redis客户端
// 注意Go标准库没有Redis客户端需要调用方使用第三方库创建
redisConfig := fac.GetRedisConfig()
if redisConfig != nil {
    // 使用go-redis创建客户端示例
    // rdb := redis.NewClient(&redis.Options{
    //     Addr:     fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),
    //     Password: redisConfig.Password,
    //     DB:       redisConfig.Database,
    // })
}

5. 获取邮件客户端(已初始化)

// 直接获取已初始化的邮件客户端
emailClient, err := fac.GetEmailClient()
if err != nil {
    log.Fatal(err)
}

// 直接使用,无需再创建
err = emailClient.SendSimple(
    []string{"recipient@example.com"},
    "主题",
    "正文",
)

6. 获取短信客户端(已初始化)

// 直接获取已初始化的短信客户端
smsClient, err := fac.GetSMSClient()
if err != nil {
    log.Fatal(err)
}

// 直接使用,无需再创建
resp, err := smsClient.SendSimple(
    []string{"13800138000"},
    map[string]string{"code": "123456"},
)

7. 获取日志记录器(已初始化)

// 直接获取已初始化的日志记录器
logger, err := fac.GetLogger()
if err != nil {
    log.Fatal(err)
}

// 直接使用,无需再创建
logger.Info("Application started")
logger.Error("Error occurred: %v", err)

8. 完整示例

package main

import (
    "log"
    
    "git.toowon.com/jimmy/go-common/config"
    "git.toowon.com/jimmy/go-common/factory"
)

func main() {
    // 加载配置
    cfg, err := config.LoadFromFile("./config.json")
    if err != nil {
        log.Fatal(err)
    }

    // 创建工厂
    fac := factory.NewFactory(cfg)

    // 获取邮件客户端(已初始化,可直接使用)
    emailClient, err := fac.GetEmailClient()
    if err != nil {
        log.Printf("Email client not available: %v", err)
    } else {
        // 直接使用
        err = emailClient.SendSimple(
            []string{"recipient@example.com"},
            "测试邮件",
            "这是测试内容",
        )
        if err != nil {
            log.Printf("Failed to send email: %v", err)
        }
    }

    // 获取短信客户端(已初始化,可直接使用)
    smsClient, err := fac.GetSMSClient()
    if err != nil {
        log.Printf("SMS client not available: %v", err)
    } else {
        // 直接使用
        resp, err := smsClient.SendSimple(
            []string{"13800138000"},
            map[string]string{"code": "123456"},
        )
        if err != nil {
            log.Printf("Failed to send SMS: %v", err)
        } else {
            log.Printf("SMS sent: %s", resp.RequestID)
        }
    }

    // 如果需要访问配置对象
    cfgObj := fac.GetConfig()
    dsn, _ := cfgObj.GetDatabaseDSN()
    log.Printf("Database DSN: %s", dsn)
}

API 参考

NewFactory(cfg *config.Config) *Factory

创建工厂实例。

参数:

  • cfg: 配置对象

返回: 工厂实例

NewFactoryFromFile(filePath string) (*Factory, error)

从配置文件直接创建工厂实例(便捷方法)。

参数:

  • filePath: 配置文件路径

返回: 工厂实例和错误信息

说明: 这是推荐的使用方式,一步完成配置加载和工厂创建。

(f *Factory) GetEmailClient() (*email.Email, error)

获取邮件客户端(已初始化)。

返回: 已初始化的邮件客户端对象和错误信息

说明: 如果邮件配置为nil返回错误。

(f *Factory) GetSMSClient() (*sms.SMS, error)

获取短信客户端(已初始化)。

返回: 已初始化的短信客户端对象和错误信息

说明: 如果短信配置为nil返回错误。

(f *Factory) GetLogger() (*logger.Logger, error)

获取日志记录器(已初始化)。

返回: 已初始化的日志记录器对象和错误信息

说明: 如果日志配置为nil会使用默认配置创建。

(f *Factory) GetDatabase() (*gorm.DB, error)

获取数据库连接对象(已初始化)。

返回: 已初始化的GORM数据库对象和错误信息

说明:

  • 支持MySQL、PostgreSQL、SQLite
  • 自动配置连接池参数
  • 数据库时间统一使用UTC时区

(f *Factory) GetRedisConfig() *config.RedisConfig

获取Redis配置用于创建Redis客户端

返回: Redis配置对象可能为nil

说明:

  • Go标准库没有Redis客户端需要调用方使用第三方库如go-redis/redis创建
  • 返回配置对象调用方可以根据配置创建Redis客户端

(f *Factory) GetConfig() *config.Config

获取配置对象。

返回: 配置对象

优势

之前的方式(需要调用方实现)

// 调用方需要自己实现创建逻辑
cfg, _ := config.LoadFromFile("./config.json")
dsn, _ := cfg.GetDatabaseDSN()
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    log.Fatal(err)
}
// 配置连接池
sqlDB, _ := db.DB()
sqlDB.SetMaxOpenConns(100)
// 才能使用
db.Find(&users)

使用工厂方式(直接获取已初始化对象)

// 方式1直接从配置文件创建最推荐
fac, _ := factory.NewFactoryFromFile("./config.json")
db, _ := fac.GetDatabase()  // 直接获取已初始化的数据库对象
// 直接使用
db.Find(&users)

// 方式2从配置对象创建
cfg, _ := config.LoadFromFile("./config.json")
fac := factory.NewFactory(cfg)
db, _ := fac.GetDatabase()  // 直接获取已初始化的数据库对象
// 直接使用
db.Find(&users)

注意事项

  1. 配置检查工厂方法会自动检查配置是否存在如果配置为nil会返回错误
  2. 错误处理所有Get方法都可能返回错误需要正确处理
  3. 配置对象:可以通过GetConfig()方法访问原始配置对象,获取其他配置信息

示例

完整示例请参考 examples/factory_example.go