依赖注入示例
Github Source: https://github.com/gogf/examples/tree/main/practices/injection
简介
本示例展示了如何在使用GoFrame
的应用程序中实现依赖注入。
主要演示:
- 使用大仓模式管理代码仓库
- 基础依赖注入设置
- 使用
DI
的服务层实现 - 集成
gRPC
的控制器层 - 使用模拟依赖的单元测试
实现重点在于使核心业务逻辑易于测试:
- 使用依赖注入分离关注点
- 为服务依赖提供清晰的接口
- 每一层都可以独立执行单元测试,保障代码质量
环境要求
目录结构
injection/
├── app/
│ ├── gateway/ # API网关服务,调用user grpc服务实现外部接口
│ │ ├── api/ # API定义
│ │ ├── internal/ # 内部实现
│ │ │ ├── cmd/ # 命令行工具
│ │ │ ├── controller/ # 控制器
│ │ │ ├── model/ # 数据模型
│ │ │ └── service/ # 业务逻辑
│ │ └── manifest/ # 配置文件
│ └── user/ # 用户服务
│ ├── api/ # API定义
│ │ ├── entity/ # 实体定义
│ │ └── user/ # 用户API proto
│ ├── internal/ # 内部实现
│ │ ├── cmd/ # 命令行工具
│ │ ├── controller/ # 使用DI的控制器
│ │ ├── dao/ # 数据访问对象
│ │ ├── model/ # 数据模型
│ │ └── service/ # 使用DI的业务逻辑
│ └── manifest/ # 配置文件
├── hack/ # 开发工具
└── utility/ # 通用工具
├── injection/ # DI工具
└── mongohelper/ # MongoDB辅助工具
功能特性
- 依赖注入使用
MongoDB
和Redis
集成gRPC
服务实现- 完整的单元测试
- 清理资源的关闭处理
- 命名依赖支持
安装设置
-
克隆仓库:
git clone https://github.com/gogf/examples.git
cd examples/practices/injection -
安装依赖:
go mod tidy
-
使用
Docker
启动所需服务:# 启动MongoDB
docker run -d --name mongo -p 27017:27017 mongo:latest
# 启动Redis
docker run -d --name redis -p 6379:6379 redis:latest
使用方法
-
运行
gRPC Server
服务:cd examples/practices/injection/app/user
go run main.go server -
运行
HTTP Server
服务:cd examples/practices/injection/app/gateway
go run main.go server -
(可选)运行异步守护进程,仅演示多命令功能,无实际逻辑:
cd examples/practices/injection/app/gateway
go run main.go worker -
(可选)运行测试:
go test ./...
实现细节
依赖注入设置
- 使用
github.com/samber/do
包进行依赖管理 - 支持命名和未命名依赖管理
- 提供常用操作的辅助函数
服务层
- 清晰的关注点分离
- 基于接口的设计
- 易于使用模拟实现进行测试
控制器层
- 支持
DI
的gRPC
集成 - 清晰的错误处理
- 合理的资源管理
可测试性
- 数据层(
dao
)、业务层(service
)、接口层(controller
)完整的单元测试 - 依赖模拟,单元测试使用的数据库配置通过
manifest/config
管理 - 通过配置文件管理微服务链接的服务地址或者域名,以便于控制依赖的服务模拟
注意事项
- 依赖注入的注册时,需要在
Shutdown
方法中正确清理资源 - 使用依赖注入时,如果需要同类型的多个实例时使用命名依赖