package serverevents import ( "fmt" "sync" di "git.apihub24.de/admin/generic-di" ) func init() { di.Injectable(newEventHandlerRegistration) } type IEventHandlerRegistration interface { Use(creator func() IEventHandler) GetHandler(eventType string) (IEventHandler, error) } type eventHandlerRegistration struct { creators map[string]func() IEventHandler instances map[string]IEventHandler mutex sync.RWMutex } func newEventHandlerRegistration() IEventHandlerRegistration { return &eventHandlerRegistration{ creators: make(map[string]func() IEventHandler), instances: make(map[string]IEventHandler), mutex: sync.RWMutex{}, } } func (registration *eventHandlerRegistration) Use(creator func() IEventHandler) { registration.mutex.Lock() defer registration.mutex.Unlock() tmp := creator() eventType := tmp.GetConnectedEventName() delete(registration.instances, eventType) delete(registration.creators, eventType) registration.creators[eventType] = creator } func (registration *eventHandlerRegistration) GetHandler(eventType string) (IEventHandler, error) { registration.mutex.RLock() defer registration.mutex.RUnlock() if creator, ok := registration.creators[eventType]; ok { if instance, ok := registration.instances[eventType]; ok { return instance, nil } registration.instances[eventType] = creator() return registration.instances[eventType], nil } return nil, fmt.Errorf("no instance of IEventHandler registered for Event %s! please call Registration Add in a init function to register your EventHandler", eventType) }