go 服务端分层框架设计

发布时间 2023-07-14 11:27:39作者: zhaogaojian

框架分为四层。models,controllers,repositories,services
以User为例

1、controller示例

package controllers

import (
	"appserver/services"

	"github.com/gin-gonic/gin"
)

type UserController struct {
	userService services.UserService
}

func NewUserController(userService services.UserService) *UserController {
	return &UserController{
		userService: userService,
	}
}

func (uc *UserController) Login(c *gin.Context) {
	// 处理用户登录的逻辑
	return
}

2、models示例

package models

import "time"

// User 表示用户模型
type User struct {
	ID        uint      `json:"id"`
	Username  string    `json:"username"`
	Password  string    `json:"-"`
	CreatedAt time.Time `json:"createdAt"`
	UpdatedAt time.Time `json:"updatedAt"`
}

// CreateUserInput 表示创建用户的输入数据
type CreateUserInput struct {
	Username string `json:"username"`
}

// UpdateUserInput 表示更新用户的输入数据
type UpdateUserInput struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

3、repositories示例

package repositories

import (
	"appserver/models"
)

type UserRepository struct {
}

func NewUserRepository() UserRepository {
	return UserRepository{}
}

func (ur *UserRepository) FindByUsername(username string) (*models.User, error) {
	// 处理根据用户名查询用户的逻辑
	user := models.User{}
	user.Username = "zhangsan"
	return &user, nil

}

// 其他用户相关的数据访问方法...

4、services示例

package services

import (
	"appserver/models"
	"appserver/repositories"
)

type UserService struct {
	userRepository repositories.UserRepository
}

func NewUserService(userRepository repositories.UserRepository) UserService {
	return UserService{
		userRepository: userRepository,
	}
}

func (us *UserService) AuthenticateUser(username, password string) (*models.User, error) {
	// 处理用户身份验证的逻辑
	user := models.User{}
	user.Username = "zhangsan"
	return &user, nil
}

// 其他用户相关的服务方法...

5、请求消息处理

	// 初始化依赖的服务和存储库
	userService := services.NewUserService(repositories.NewUserRepository())

	// 创建控制器
	userController := controllers.NewUserController(userService)

	// 用户登录
	router.POST("/user/login", userController.Login)