创建自己的服务
创建自己的服务
声明服务接口
先在外层声明自己服务的方法.
外层含义是指: 这个外层包可以引用第三方开源库, 但不能引用除了 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")
推荐文章: