forked from apps/featurer
Initial commit.
This commit is contained in:
54
server/internal/application/service.go
Normal file
54
server/internal/application/service.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package application
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
var (
|
||||
// ErrServiceAlreadyRegistered appears when trying to register a service with already taken name.
|
||||
ErrServiceAlreadyRegistered = errors.New("service already registered")
|
||||
// ErrServiceNotRegistered appears when trying to get a registered service with unknown name.
|
||||
ErrServiceNotRegistered = errors.New("unknown service")
|
||||
)
|
||||
|
||||
// Service это интерфейс, которому должны соответствовать все сервисы, используемые в приложении.
|
||||
type Service interface {
|
||||
ConnectDependencies() error
|
||||
GetName() string
|
||||
Initialize() error
|
||||
LaunchStartupTasks() error
|
||||
Shutdown() error
|
||||
}
|
||||
|
||||
// GetService возвращает сервис по имени, или же ошибку, если сервис не был зарегистрирован ранее.
|
||||
func (a *Application) GetService(name string) (Service, error) {
|
||||
a.servicesMutex.RLock()
|
||||
service, found := a.services[name]
|
||||
a.servicesMutex.RUnlock()
|
||||
|
||||
if !found {
|
||||
return nil, fmt.Errorf("%w: get service '%s': %w", ErrApplication, name, ErrServiceNotRegistered)
|
||||
}
|
||||
|
||||
return service, nil
|
||||
}
|
||||
|
||||
// RegisterService регистрирует сервис, или возвращает ошибку, если сервис с таким именем уже был
|
||||
// зарегистрирован ранее.
|
||||
func (a *Application) RegisterService(service Service) error {
|
||||
_, found := a.services[service.GetName()]
|
||||
if found {
|
||||
return fmt.Errorf("%w: register service '%s': %w", ErrApplication, service.GetName(), ErrServiceAlreadyRegistered)
|
||||
}
|
||||
|
||||
if err := service.Initialize(); err != nil {
|
||||
return fmt.Errorf("%w: initializing service '%s': %w", ErrApplication, service.GetName(), err)
|
||||
}
|
||||
|
||||
a.servicesMutex.Lock()
|
||||
a.services[service.GetName()] = service
|
||||
a.servicesMutex.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user