Go基础(⑦实例和依赖注入)

依赖注入

不使用依赖注入(不推荐)

Go 复制代码
func (h *AdminHandler) Login(c *gin.Context) {
    // 每次都要自己创建服务
    adminService := service.NewAdminService()
    userService := service.NewUserService()
    taskService := service.NewTaskService()
    
    // 使用服务
    admin, err := adminService.AuthenticateAdmin(username, password)
    // ...
}

使用依赖注入(推荐)

Go 复制代码
// 1. 定义结构体,声明需要什么
type AdminHandler struct {
    adminService *service.AdminService
    userService  *service.UserService
    taskService  *service.TaskService
}

// 2. 创建时注入依赖
func NewAdminHandler() *AdminHandler {
    return &AdminHandler{
        adminService: service.NewAdminService(),  // 注入
        userService:  service.NewUserService(),   // 注入
        taskService:  service.NewTaskService(),   // 注入
    }
}

// 3. 使用时直接调用
func (h *AdminHandler) Login(c *gin.Context) {
    // 直接使用,不需要重新创建
    admin, err := h.adminService.AuthenticateAdmin(username, password)
    // ...
}

为什么用依赖注入?

问题1:重复创建

Go 复制代码
// 每个方法都要创建服务
func (h *AdminHandler) Login(c *gin.Context) {
    adminService := service.NewAdminService()  // 重复创建
    // ...
}

func (h *AdminHandler) CreateUser(c *gin.Context) {
    adminService := service.NewAdminService()  // 重复创建
    // ...
}

解决:依赖注入

Go 复制代码
// 只创建一次,所有方法共享
type AdminHandler struct {
    adminService *service.AdminService  // 只创建一次
}

func (h *AdminHandler) Login(c *gin.Context) {
    // 直接使用
    admin, err := h.adminService.AuthenticateAdmin(username, password)
}

func (h *AdminHandler) CreateUser(c *gin.Context) {
    // 直接使用
    user, err := h.adminService.CreateUser(username, password)
}

实例

对比其他语言

Go 复制代码
Go:     NewAdminHandler()
Java:   new AdminHandler()
C++:    new AdminHandler()
Python: AdminHandler()

实际例子

正确的命名

Go 复制代码
// 结构体
type AdminHandler struct {
    adminService *service.AdminService
}

// 构造函数
func NewAdminHandler() *AdminHandler {
    return &AdminHandler{
        adminService: service.NewAdminService(),
    }
}

// 使用
handler := NewAdminHandler()

错误的命名

Go 复制代码
// ❌ 错误:有空格
func New AdminHandler() *AdminHandler {
    // ...
}

// ❌ 错误:小写
func newAdminHandler() *AdminHandler {
    // ...
}

// ❌ 错误:其他命名
func CreateAdminHandler() *AdminHandler {
    // ...
}

123

相关推荐
fire-flyer20 小时前
设计模式之观察者模式
java·开发语言
咬_咬21 小时前
C++仿muduo库高并发服务器项目:Poller模块
服务器·开发语言·c++·epoll·muduo
Highcharts.js21 小时前
在Python中配置高度交互的数据可视化:Highcharts完全指南
开发语言·python·信息可视化·highcharts
小生凡一21 小时前
图解|Go语言实现 Agent|LLM+MCP+RAG
开发语言·后端·golang
思茂信息21 小时前
CST电动车EMC仿真(二)——电机控制器MCU的EMC仿真
开发语言·javascript·单片机·嵌入式硬件·cst·电磁仿真
开始了码1 天前
关于qt运行程序点击几下未响应的原因
开发语言·qt
QT 小鲜肉1 天前
【QT/C++】Qt样式设置之CSS知识(系统性概括)
linux·开发语言·css·c++·笔记·qt
洛克希德马丁1 天前
Qt配置安卓开发环境
android·开发语言·qt
我要升天!1 天前
QT-- 理解项目文件
开发语言·数据库·qt
froginwe111 天前
Ruby 范围(Range)
开发语言