跳转至

服务

服务层包含业务逻辑,编排模型和其他服务。

创建服务

基本结构

package service

import (
    "github.com/chuccp/go-web-frame/core"
    wf "github.com/chuccp/go-web-frame"
    "myapp/entity"
    "myapp/model"
)

type UserService struct {
    core.IService
    userModel *model.UserModel
}

func (s *UserService) Init(ctx *core.Context) error {
    s.userModel = wf.GetModel[*model.UserModel](ctx)
    return nil
}

func (s *UserService) GetUserById(id uint) (*entity.User, error) {
    return s.userModel.FindByPK(id)
}

func (s *UserService) GetAllUsers() ([]*entity.User, error) {
    return s.userModel.FindAll()
}

注册服务

package main

import (
    "context"
    wf "github.com/chuccp/go-web-frame"
    "github.com/chuccp/go-web-frame/config"
    "myapp/model"
    "myapp/service"
)

func main() {
    cfg, _ := config.LoadSingleFileConfig("application.yml")
    builder := wf.NewBuilder(cfg)

    builder.Model(&model.UserModel{})
    builder.Service(&service.UserService{})

    builder.Build().Run(context.Background())
}

依赖注入

获取模型

type UserService struct {
    core.IService
    userModel    *model.UserModel
    profileModel *model.ProfileModel
}

func (s *UserService) Init(ctx *core.Context) error {
    s.userModel = wf.GetModel[*model.UserModel](ctx)
    s.profileModel = wf.GetModel[*model.ProfileModel](ctx)
    return nil
}

获取其他服务

type OrderService struct {
    core.IService
    userService *service.UserService
    orderModel  *model.OrderModel
}

func (s *OrderService) Init(ctx *core.Context) error {
    s.userService = wf.GetService[*service.UserService](ctx)
    s.orderModel = wf.GetModel[*model.OrderModel](ctx)
    return nil
}

获取配置

type EmailService struct {
    core.IService
    apiKey string
}

func (s *EmailService) Init(ctx *core.Context) error {
    s.apiKey = ctx.GetConfig().GetString("email.api_key")
    return nil
}

业务逻辑示例

创建用户

func (s *UserService) CreateUser(input *CreateUserInput) (*entity.User, error) {
    if !s.isValidEmail(input.Email) {
        return nil, errors.New("invalid email format")
    }

    exists, _ := s.userModel.Query().Where("email = ?", input.Email).Count()
    if exists > 0 {
        return nil, errors.New("email already registered")
    }

    user := &entity.User{Name: input.Name, Email: input.Email}
    if err := s.userModel.Save(user); err != nil {
        return nil, err
    }

    return user, nil
}

事务操作

type OrderService struct {
    core.IService
    ctx        *core.Context
    orderModel *model.OrderModel
}

func (s *OrderService) Init(ctx *core.Context) error {
    s.ctx = ctx
    s.orderModel = wf.GetModel[*model.OrderModel](ctx)
    return nil
}

func (s *OrderService) CreateOrder(input *CreateOrderInput) (*entity.Order, error) {
    var order *entity.Order

    err := s.ctx.GetTransaction().Exec(func(tx *db.DB) error {
        orderModel := wf.GetReNewModel[*model.OrderModel](tx, s.ctx)
        order = &entity.Order{UserID: input.UserID, Total: input.Total}
        if err := orderModel.Save(order); err != nil {
            return err
        }
        for _, item := range input.Items {
            orderItem := &entity.OrderItem{OrderID: order.Id, ProductID: item.ProductID}
            if err := orderModel.Save(orderItem); err != nil {
                return err
            }
        }
        return nil
    })

    return order, err
}

在控制器中获取服务

type UserController struct {
    core.IService
    userService *service.UserService
}

func (c *UserController) Init(ctx *core.Context) error {
    c.userService = wf.GetService[*service.UserService](ctx)
    ctx.Get("/users", c.List)
    ctx.Get("/users/:id", c.Get)
    return nil
}

func (c *UserController) List(req *web.Request) (any, error) {
    return c.userService.GetAllUsers()
}

func (c *UserController) Get(req *web.Request) (any, error) {
    return c.userService.GetUserById(req.ParamUint("id"))
}

完整示例

package main

import (
    "context"
    wf "github.com/chuccp/go-web-frame"
    "github.com/chuccp/go-web-frame/config"
    "github.com/chuccp/go-web-frame/core"
    "myapp/controller"
    "myapp/model"
    "myapp/service"
)

func main() {
    cfg, _ := config.LoadSingleFileConfig("application.yml")
    builder := wf.NewBuilder(cfg)

    builder.Model(&model.UserModel{})
    builder.Service(&service.UserService{})

    restGroup := wf.NewRestGroupBuilder().
        Rest(&controller.UserController{}).
        Port(8081).
        Build()
    builder.RestGroup(restGroup)

    builder.Build().Run(context.Background())
}

下一步