依赖注入与Wire

依赖注入

已有的初始化代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func main() {
	db := initDB()
	rdb := initRedis()

	server := initWebServerWithJwt()
	u := initUser(db, rdb)
	u.RegisterRoutes(server)

	server.Run(":18081")
}

func initUser(db *gorm.DB, rdb goredis.Cmdable) *web.UserHandler {
	ud := dao.NewUserDAO(db)
	uc := cache.NewUserCache(rdb)
	repo := repository.NewUserRepository(ud, uc)
	svc := service.NewUserService(repo)

	codeCache := cache.NewCodeCache(rdb)
	codeRepo := repository.NewCodeRepository(codeCache)
	smsSvc := memory.NewService()
	codeSvc := service.NewCodeService(codeRepo, smsSvc)
	u := web.NewUserHandler(svc, codeSvc)
	return u
}

仔细看我们的初始化代码,就会发现整体来说可以分成几个步骤:

第六章 浏览器跨域请求问题

背景

有一个前后端分离的项目,前端向后端业务发起了一个注册的请求,从 network 中看到下面的现象:

点击第一个请求,看到标头发现请求的URL是 http://localhost:28080/api/v1/users/signup

第五章 奠定基石 —— 项目的“七通一平”工程

每个稍微有点规模的项目里,都有一类“默默无闻”却至关重要的代码,它们就是基础组件

它们就像城市的“七通一平”(通水、通电、通路等基础设施),没什么酷炫的业务功能,但如果没有它们,上层的应用建筑一天都撑不下去。这些组件通常由经验丰富的老手或项目初期的架构师搭建,为整个项目定下规矩。否则,人人自建一套,项目将沦为一片混乱的“违章建筑群”。

第四章 流程调用示例

现在,我们就把上一章建立的“饭店后厨”模型,进行一次真实的“开火预演”。

我将沿用之前的风格,将这些代码片段串成一个完整的故事,并在此过程中进行评估、优化,补充一些关键的“幕后细节”,让整个流程更加清晰和健壮。

第三章 目录结构设计

1 目录概览

给代码安个家:后端分层艺术入门

🎭 我们的“建筑规划图”

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
your project/
├── internal/         # 内部代码,Go 语言机制限制此目录只能被该项目内部引用
│   ├── domain/       # 领域层:业务核心,“原料”的定义与规则
│   ├── repository/   # 仓库层:数据的“仓库管理员”
│   │   ├── dao/      # 数据访问层:与数据库打交道的“搬运工”
│   │   └── cache/    # 缓存层:(可选)仓库里的“速取窗口”
│   ├── service/      # 服务层:业务逻辑的“总厨”
│   └── web/          # 表现层:与前端打交道的“服务员”
├── pkg/              # 公共代码,可以被外部项目引用的工具包
└── main.go           # 程序入口:“饭店老板”和“大厅入口”

👆 project/main.go(一个简单的“反面教材”)

第二章 拆开“信封”,当一个严格的“表格审查员”

前一章,我们已经为我们的互联网大厦搭建好了“前台总机”和“用户部”,并且制定了高效的“电话转接”规则(路由)。现在,当一个用户填好了“注册申请表”(JSON数据)并提交过来,我们的“注册专员”(SignUp方法)该如何处理这份表格呢?