创建自己的服务

未匹配的标注

创建自己的服务

声明服务接口

先在外层声明自己服务的方法.

外层含义是指: 这个外层包可以引用第三方开源库, 但不能引用除了 services 包外的系统内任何包.

目录位置, 应该尽量放在根目录下, 建议直接把接口定义放在 services 包下. 因为定义的服务, 在引用 services 包时, 有可能 services 包也要引入你的服务包, 这就出现环形引用问题了.

services/my.go

package services

type MyService interface {
    Service // 需要继承通用服务接口

    MyMethod1(args ...any) any // 我的方法1
    MyMethod2(args ...any) any // 我的方法2
}

关于通用服务接口

services/service.go

package services

// Service 服务通用接口
type Service interface {
    Init(...Service) Service
}

所有服务都应该实现 Init(...Service) Service 方法, 该方法主要用来断言服务依赖, 以及根据依赖初始化本服务.

编写具体实现

services/my/my.go

package my

import "gower/services"

// Service 定义 my.Service 核心服务结构体, 该结构体指针类型将实现 services.MyService 接口
type Service struct {}

// 定义依赖变量
var config services.Config

// New 新建 My 服务
func New() *Service {
    return new(Service)
}

// Init 定义通用服务实现
func (s *Service) Init(args ...services.Service) services.Service {
    // 取出依赖, 赋值到本包依赖变量上
    config = args[0].(services.Config)


    //TODO: 根据依赖, 执行一系列初始化任务

    // 返回本服务
    return s
}

// MyMethod1 实现我的方法1
func (s *Service) MyMethod1(args ...any) any {
    return nil
}

// MyMethod2 实现我的方法2
func (s *Service) MyMethod2(args ...any) any {
    return nil
}

注册服务

app/providers/my.go

package providers

import (
    "gower/services"
    "gower/services/my"
)

// 检测 my.Service 结构体指针是否实现了 services.MyService 接口
var _ services.MyService = (*my.Service)(nil)

func init() {
    // "my" 是服务标识符. 关于注册格式, 可以参阅 auth-JWT服务 的内容
    P.Register("my", func() (Depends, Resolve) {
        return Depends{"config"}, func(ss ...services.Service) services.Service {
            return my.New().Init(ss...)
        }
    })
}

定义快捷获取服务的方法

在 app/app.go 中, 定义一个方法, 获取 my 服务, 同时处理 my 服务为空情况

app/app.go

// My 获取我的服务
func My() services.MyService {
    my, ok := Get("my").(services.MyService)
    if ok {
        return my
    }

    return services.MyService(nil)
}

如何使用

取服务

app/http/controllers/controllers.go

.
.
.

var (
    my := app.My()
)
.
.
.

用服务

app/http/controllers/home_controller.go


a := my.MyMethod1("test")

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~