目录

Goland如何玩依赖注入基于gonev2创建一个service

Goland如何玩依赖注入——基于gone@v2创建一个service

经过多天的工作,终于把gone2的beta版本发布出去了。在v2版本中,做了很多更新,最大的改进是将一些不必要的概念给隐藏起来了,提供了Provider机制……

go install github.com/gone-io/gonectr@latest
gonectr -v
Gonectr version: v0.0.17

版本应该大于:v0.0.17

gonectr create -t v2+web+mysql demo

https://i-blog.csdnimg.cn/direct/4f7a8849f4234a1bb789debdb2057e73.png

项目是以https://github.com/gone-io/template-v2-web-mysql 为模板创建的。

├── go.mod
├── go.sum
├── Dockerfile
├── docker-compose.yaml
├── Makefile
├── README.md
├── cmd
│   └── server
│       ├── import.gone.go
│       └── main.go
├── config
│   └── default.properties
├── internal
│   ├── controller
│   │   ├── init.gone.go
│   │   └── user.go
│   ├── interface
│   │   ├── entity
│   │   │   └── user.go
│   │   ├── mock
│   │   │   ├── i_depenendent.gone.go
│   │   │   ├── i_user.gone.go
│   │   │   ├── i_user_token.gone.go
│   │   │   └── priest.gone.go
│   │   ├── package.go
│   │   └── service
│   │       ├── i_depenendent.go
│   │       ├── i_user.go
│   │       └── i_user_token.go
│   ├── loader.go
│   ├── module
│   │   ├── dependent
│   │   │   ├── dependent.go
│   │   │   └── init.gone.go
│   │   └── user
│   │       ├── init.gone.go
│   │       ├── token.go
│   │       ├── user.go
│   │       └── user_test.go
│   ├── pkg
│   │   ├── e
│   │   │   └── error.go
│   │   └── utils
│   │       ├── ctx.go
│   │       ├── password.go
│   │       └── token.go
│   └── router
│       ├── auth_router.go
│       ├── init.gone.go
│       └── pub_router.go
├── scripts
│   └── mysql
│       └── initdb.d
│           └── user.sql
└── tests
    └── api
        ├── http-client.env.json
        └── user.http
  • cmd/server/main.go 是服务的入口文件:
package main

import (
	"demo/internal"
	"github.com/gone-io/gone/v2"
)

func main() {
	gone.
		Loads(internal.Load).
		Serve()
}
  • config 是配置文件目录,支持多种配置文件格式,包括:JSON, TOML, YAML, HCL, INI, envfile or Java properties,配置文件的读取的底层是使用viper实现的。

  • internal 是业务代码目录,包括webController、 业务接口定义 和 业务逻辑实现等

    • internal/router 路由分组
    • internal/controller web接口定义
    • internal/interface 业务接口定义
    • internal/module 业务逻辑实现
  • scripts 项目脚本

  • tests 接口测试的http文件,可以直接使用goland打开

    https://i-blog.csdnimg.cn/direct/76b4bbca798645d4b5ffccdd5adfddda.png

该项目使用的mysql数据库,需要:

  1. 创建数据库,然后导入位于 scripts/mysql/initdb.d/user.sql 的SQL文件
  2. 按实际情况修改配置文件 config/properties
# 使用mysql
database.driver-name=mysql

db.host=localhost
db.port=3306
db.name=demo
db.username=root
db.password=123456

# 数据源配置 配置中,使用${key}来引用配置文件中的值
database.dsn=${db.username}:${db.password}@tcp(${db.host}:${db.port})/${db.name}?charset=utf8mb4&loc=Local

如果本地安装了docker-desktop,只需要执行:

docker compose up -d mysql

首先,下载依赖:

go mod tidy

有多种方式:

  • 1. 使用 gonectr 来启动项目:
gonectr run ./cmd/server

会看到屏幕打印内容如下:

https://i-blog.csdnimg.cn/direct/dd63418e2ce648bfae93b6d3b710d4f0.png

  • 2. 使用 go run 命令来启动

    **但是请注意,需要先执行 go generate ./... 来生成辅助代码,这些辅助代码包含用于将 组件(Goner)注册到框架和用于mock测试。

go generate ./...
go run ./cmd/server
  • 3. 使用 goland

    点开 Edit Configurations ,可以已经默认添加了一个启动项,并且在 Before launch 配置 了 go generate ./... ,所以直接点击”运行“就可以了。

    https://i-blog.csdnimg.cn/direct/a64c2a48420e4033845b66d9a05b6381.png

    https://i-blog.csdnimg.cn/direct/79cbf097696b499795f82f0bea957c0e.png

  • 3. 使用 vs code

    在vscode中已经配置了启动项和启动前的任务,所以侧边栏切换到"运行和调试"点击 运行即可。

  • .vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "server",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "cwd": "${workspaceFolder}",
            "program": "${workspaceFolder}/cmd/server",
            "preLaunchTask": "generate"
        }
    ]
}
  • .vscode/tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "generate",
            "type": "shell",
            "command": "go generate ./...",
            "problemMatcher": []
        }
    ]
}

https://i-blog.csdnimg.cn/direct/5eb9ba91d33243bf86f4892f2cb9b4a0.png

项目同时提供了docker-compose.yaml 和 Dockerfile,方便生成镜像部署到服务器上。