busniess-user-center/vendor/github.com/samber/do/di.go

167 lines
3.6 KiB
Go

package do
import (
"fmt"
)
func Provide[T any](i *Injector, provider Provider[T]) {
name := generateServiceName[T]()
_i := getInjectorOrDefault(i)
if _i.exists(name) {
panic(fmt.Errorf("DI: service `%s` has already been declared", name))
}
service := newServiceLazy(name, provider)
_i.set(name, service)
_i.logf("service %s injected", name)
}
func ProvideNamed[T any](i *Injector, name string, provider Provider[T]) {
_i := getInjectorOrDefault(i)
if _i.exists(name) {
panic(fmt.Errorf("DI: service `%s` has already been declared", name))
}
service := newServiceLazy(name, provider)
_i.set(name, service)
_i.logf("service %s injected", name)
}
func ProvideValue[T any](i *Injector, value T) {
name := generateServiceName[T]()
_i := getInjectorOrDefault(i)
if _i.exists(name) {
panic(fmt.Errorf("DI: service `%s` has already been declared", name))
}
service := newServiceEager(name, value)
_i.set(name, service)
_i.logf("service %s injected", name)
}
func ProvideNamedValue[T any](i *Injector, name string, value T) {
_i := getInjectorOrDefault(i)
if _i.exists(name) {
panic(fmt.Errorf("DI: service `%s` has already been declared", name))
}
service := newServiceEager(name, value)
_i.set(name, service)
_i.logf("service %s injected", name)
}
func Override[T any](i *Injector, provider Provider[T]) {
name := generateServiceName[T]()
_i := getInjectorOrDefault(i)
service := newServiceLazy(name, provider)
_i.set(name, service)
_i.logf("service %s overridden", name)
}
func OverrideNamed[T any](i *Injector, name string, provider Provider[T]) {
_i := getInjectorOrDefault(i)
service := newServiceLazy(name, provider)
_i.set(name, service)
_i.logf("service %s overridden", name)
}
func OverrideValue[T any](i *Injector, value T) {
name := generateServiceName[T]()
_i := getInjectorOrDefault(i)
service := newServiceEager(name, value)
_i.set(name, service)
_i.logf("service %s overridden", name)
}
func OverrideNamedValue[T any](i *Injector, name string, value T) {
_i := getInjectorOrDefault(i)
service := newServiceEager(name, value)
_i.set(name, service)
_i.logf("service %s overridden", name)
}
func Invoke[T any](i *Injector) (T, error) {
name := generateServiceName[T]()
return InvokeNamed[T](i, name)
}
func MustInvoke[T any](i *Injector) T {
s, err := Invoke[T](i)
must(err)
return s
}
func InvokeNamed[T any](i *Injector, name string) (T, error) {
_i := getInjectorOrDefault(i)
serviceAny, ok := _i.get(name)
if !ok {
return empty[T](), _i.serviceNotFound(name)
}
service, ok := serviceAny.(Service[T])
if !ok {
return empty[T](), _i.serviceNotFound(name)
}
instance, err := service.getInstance(_i)
if err != nil {
return empty[T](), err
}
_i.onServiceInvoke(name)
_i.logf("service %s invoked", name)
return instance, err
}
func MustInvokeNamed[T any](i *Injector, name string) T {
s, err := InvokeNamed[T](i, name)
must(err)
return s
}
func HealthCheck[T any](i *Injector) error {
name := generateServiceName[T]()
return getInjectorOrDefault(i).healthcheckImplem(name)
}
func HealthCheckNamed(i *Injector, name string) error {
return getInjectorOrDefault(i).healthcheckImplem(name)
}
func Shutdown[T any](i *Injector) error {
name := generateServiceName[T]()
return getInjectorOrDefault(i).shutdownImplem(name)
}
func MustShutdown[T any](i *Injector) {
name := generateServiceName[T]()
must(getInjectorOrDefault(i).shutdownImplem(name))
}
func ShutdownNamed(i *Injector, name string) error {
return getInjectorOrDefault(i).shutdownImplem(name)
}
func MustShutdownNamed(i *Injector, name string) {
must(getInjectorOrDefault(i).shutdownImplem(name))
}