73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
package modular
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/kercylan98/minotaur/utils/log"
|
|
"sync"
|
|
)
|
|
|
|
var application *modular
|
|
|
|
func init() {
|
|
application = &modular{}
|
|
}
|
|
|
|
type modular struct {
|
|
registerServices []Service
|
|
services []*service
|
|
}
|
|
|
|
// RegisterServices 注册服务
|
|
func (m *modular) RegisterServices(s ...Service) {
|
|
application.registerServices = append(application.registerServices, s...)
|
|
}
|
|
|
|
// Run 运行模块化应用程序
|
|
func Run() {
|
|
m := application
|
|
var names = make(map[string]bool)
|
|
for i := 0; i < len(m.registerServices); i++ {
|
|
s := newService(m.registerServices[i])
|
|
if names[s.name] {
|
|
panic(fmt.Errorf("service %s is already registered", s.name))
|
|
}
|
|
names[s.name] = true
|
|
m.services = append(m.services, s)
|
|
}
|
|
|
|
// OnInit
|
|
for i := 0; i < len(m.services); i++ {
|
|
s := m.services[i]
|
|
s.instance.OnInit()
|
|
log.Info(fmt.Sprintf("service %s initialized", s.name))
|
|
}
|
|
|
|
// OnPreload
|
|
for i := 0; i < len(m.services); i++ {
|
|
s := m.services[i]
|
|
s.instance.OnPreload()
|
|
log.Info(fmt.Sprintf("service %s preloaded", s.name))
|
|
}
|
|
|
|
// OnMount
|
|
for i := 0; i < len(m.services); i++ {
|
|
s := m.services[i]
|
|
s.instance.OnMount()
|
|
}
|
|
|
|
// OnBlock
|
|
var wait = new(sync.WaitGroup)
|
|
for i := 0; i < len(m.services); i++ {
|
|
s := m.services[i]
|
|
if block, ok := s.instance.(Block); ok {
|
|
wait.Add(1)
|
|
go func(wait *sync.WaitGroup) {
|
|
defer wait.Done()
|
|
block.OnBlock()
|
|
}(wait)
|
|
}
|
|
}
|
|
wait.Wait()
|
|
log.Info("all services exited")
|
|
}
|