Documentation ΒΆ
Index ΒΆ
- Constants
- Variables
- func As[Initial any, Alias any](i Injector) error
- func AsNamed[Initial any, Alias any](i Injector, initial string, alias string) error
- func Bind[Initial any, Alias any]() func(Injector)
- func BindNamed[Initial any, Alias any](initial string, alias string) func(Injector)
- func Eager[T any](value T) func(Injector)
- func EagerNamed[T any](serviceName string, value T) func(Injector)
- func ExampleInjector_Clone()
- func ExampleInjector_HealthCheck()
- func ExampleInjector_ListInvokedServices_invoked()
- func ExampleInjector_ListInvokedServices_notInvoked()
- func ExampleInjector_ListProvidedServices()
- func ExampleInjector_Shutdown()
- func HealthCheck[T any](i Injector) error
- func HealthCheckNamed(i Injector, name string) error
- func HealthCheckNamedWithContext(ctx context.Context, i Injector, name string) error
- func HealthCheckWithContext[T any](ctx context.Context, i Injector) error
- func Invoke[T any](i Injector) (T, error)
- func InvokeAs[T any](i Injector) (T, error)
- func InvokeNamed[T any](i Injector, name string) (T, error)
- func InvokeStruct[T any](i Injector) (*T, error)
- func Lazy[T any](p Provider[T]) func(Injector)
- func LazyNamed[T any](serviceName string, p Provider[T]) func(Injector)
- func MustAs[Initial any, Alias any](i Injector)
- func MustAsNamed[Initial any, Alias any](i Injector, initial string, alias string)
- func MustInvoke[T any](i Injector) T
- func MustInvokeAs[T any](i Injector) T
- func MustInvokeNamed[T any](i Injector, name string) T
- func MustInvokeStruct[T any](i Injector) *T
- func MustShutdown[T any](i Injector)
- func MustShutdownNamed(i Injector, name string)
- func MustShutdownNamedWithContext(ctx context.Context, i Injector, name string)
- func MustShutdownWithContext[T any](ctx context.Context, i Injector)
- func NameOf[T any]() string
- func Override[T any](i Injector, provider Provider[T])
- func OverrideNamed[T any](i Injector, name string, provider Provider[T])
- func OverrideNamedTransient[T any](i Injector, name string, provider Provider[T])
- func OverrideNamedValue[T any](i Injector, name string, value T)
- func OverrideTransient[T any](i Injector, provider Provider[T])
- func OverrideValue[T any](i Injector, value T)
- func Package(services ...func(i Injector)) func(Injector)
- func Provide[T any](i Injector, provider Provider[T])
- func ProvideNamed[T any](i Injector, name string, provider Provider[T])
- func ProvideNamedTransient[T any](i Injector, name string, provider Provider[T])
- func ProvideNamedValue[T any](i Injector, name string, value T)
- func ProvideTransient[T any](i Injector, provider Provider[T])
- func ProvideValue[T any](i Injector, value T)
- func Shutdown[T any](i Injector) error
- func ShutdownNamed(i Injector, name string) error
- func ShutdownNamedWithContext(ctx context.Context, i Injector, name string) error
- func ShutdownWithContext[T any](ctx context.Context, i Injector) error
- func Transient[T any](p Provider[T]) func(Injector)
- func TransientNamed[T any](serviceName string, p Provider[T]) func(Injector)
- type DAG
- type EdgeService
- type ExplainInjectorOutput
- type ExplainInjectorScopeOutput
- type ExplainInjectorServiceOutput
- type ExplainServiceDependencyOutput
- type ExplainServiceOutput
- type Healthchecker
- type HealthcheckerWithContext
- type Injector
- type InjectorOpts
- type Provider
- type RootScope
- func (s *RootScope) AddAfterInvocationHook(hook func(*Scope, string, error))
- func (s *RootScope) AddAfterRegistrationHook(hook func(*Scope, string))
- func (s *RootScope) AddAfterShutdownHook(hook func(*Scope, string, error))
- func (s *RootScope) AddBeforeInvocationHook(hook func(*Scope, string))
- func (s *RootScope) AddBeforeRegistrationHook(hook func(*Scope, string))
- func (s *RootScope) AddBeforeShutdownHook(hook func(*Scope, string))
- func (s *RootScope) Ancestors() []*Scope
- func (s *RootScope) ChildByID(id string) (*Scope, bool)
- func (s *RootScope) ChildByName(name string) (*Scope, bool)
- func (s *RootScope) Children() []*Scope
- func (s *RootScope) Clone() *RootScope
- func (s *RootScope) CloneWithOpts(opts *InjectorOpts) *RootScope
- func (s *RootScope) HealthCheck() map[string]error
- func (s *RootScope) HealthCheckWithContext(ctx context.Context) map[string]error
- func (s *RootScope) ID() string
- func (s *RootScope) ListInvokedServices() []EdgeService
- func (s *RootScope) ListProvidedServices() []EdgeService
- func (s *RootScope) Name() string
- func (s *RootScope) RootScope() *RootScope
- func (s *RootScope) Scope(name string, p ...func(Injector)) *Scope
- func (s *RootScope) Shutdown() *ShutdownErrors
- func (s *RootScope) ShutdownOnSignals(signals ...os.Signal) (os.Signal, *ShutdownErrors)
- func (s *RootScope) ShutdownOnSignalsWithContext(ctx context.Context, signals ...os.Signal) (os.Signal, *ShutdownErrors)
- func (s *RootScope) ShutdownWithContext(ctx context.Context) *ShutdownErrors
- type Scope
- func (s *Scope) Ancestors() []*Scope
- func (s *Scope) ChildByID(id string) (*Scope, bool)
- func (s *Scope) ChildByName(name string) (*Scope, bool)
- func (s *Scope) Children() []*Scope
- func (s *Scope) HealthCheck() map[string]error
- func (s *Scope) HealthCheckWithContext(ctx context.Context) map[string]error
- func (s *Scope) ID() string
- func (s *Scope) ListInvokedServices() []EdgeService
- func (s *Scope) ListProvidedServices() []EdgeService
- func (s *Scope) Name() string
- func (s *Scope) RootScope() *RootScope
- func (s *Scope) Scope(name string, packages ...func(Injector)) *Scope
- func (s *Scope) Shutdown() *ShutdownErrors
- func (s *Scope) ShutdownWithContext(ctx context.Context) *ShutdownErrors
- type Service
- type ServiceAny
- type ServiceType
- type ShutdownErrors
- type Shutdowner
- type ShutdownerWithContext
- type ShutdownerWithContextAndError
- type ShutdownerWithError
Examples ΒΆ
Constants ΒΆ
const DefaultRootScopeName = "[root]"
const DefaultStructTagKey = "do"
Variables ΒΆ
var ErrCircularDependency = errors.New("DI: circular dependency detected")
var ErrHealthCheckTimeout = errors.New("DI: health check timeout")
var ErrServiceNotFound = errors.New("DI: could not find service")
var ErrServiceNotMatch = errors.New("DI: could not find service satisfying interface")
var MaxInvokationFrames uint32 = 100
Functions ΒΆ
func EagerNamed ΒΆ
func ExampleInjector_Clone ΒΆ
func ExampleInjector_Clone()
func ExampleInjector_HealthCheck ΒΆ
func ExampleInjector_HealthCheck()
func ExampleInjector_ListInvokedServices_invoked ΒΆ
func ExampleInjector_ListInvokedServices_invoked()
func ExampleInjector_ListInvokedServices_notInvoked ΒΆ
func ExampleInjector_ListInvokedServices_notInvoked()
func ExampleInjector_ListProvidedServices ΒΆ
func ExampleInjector_ListProvidedServices()
func ExampleInjector_Shutdown ΒΆ
func ExampleInjector_Shutdown()
func HealthCheck ΒΆ
HealthCheck returns a service status, using type inference to determine the service name.
func HealthCheckNamed ΒΆ
HealthCheckNamed returns a service status.
func HealthCheckNamedWithContext ΒΆ
HealthCheckNamedWithContext returns a service status.
func HealthCheckWithContext ΒΆ
HealthCheckWithContext returns a service status, using type inference to determine the service name.
func Invoke ΒΆ
Invoke invokes a service in the DI container, using type inference to determine the service name.
Example ΒΆ
injector := New() type test struct { foobar string } Provide(injector, func(i Injector) (*test, error) { return &test{foobar: "foobar"}, nil }) value, err := Invoke[*test](injector) fmt.Println(value) fmt.Println(err)
Output: &{foobar} <nil>
func InvokeAs ΒΆ
InvokeAs invokes a service in the DI container. The first service matching the provided type or interface will be invoked.
func InvokeNamed ΒΆ
InvokeNamed invokes a named service in the DI container.
Example ΒΆ
injector := New() type test struct { foobar string } ProvideNamed(injector, "my_service", func(i Injector) (*test, error) { return &test{foobar: "foobar"}, nil }) value, err := InvokeNamed[*test](injector, "my_service") fmt.Println(value) fmt.Println(err)
Output: &{foobar} <nil>
func InvokeStruct ΒΆ
InvokeStruct invokes services located in struct properties. The struct fields must be tagged with `do:""` or `do:"name"`, where `name` is the service name in the DI container. If the service is not found in the DI container, an error is returned. If the service is found but not assignable to the struct field, an error is returned.
func MustAsNamed ΒΆ
AsNamed declares a named alias for a named service. It panics on error.
func MustInvoke ΒΆ
MustInvoke invokes a service in the DI container, using type inference to determine the service name. It panics on error.
Example ΒΆ
injector := New() type test struct { foobar string } Provide(injector, func(i Injector) (*test, error) { return &test{foobar: "foobar"}, nil }) value := MustInvoke[*test](injector) fmt.Println(value)
Output: &{foobar}
func MustInvokeAs ΒΆ
MustInvokeAs invokes a service in the DI container. The first service matching the provided type or interface will be invoked. It panics on error.
func MustInvokeNamed ΒΆ
MustInvokeNamed invokes a named service in the DI container. It panics on error.
Example ΒΆ
injector := New() type test struct { foobar string } ProvideNamed(injector, "my_service", func(i Injector) (*test, error) { return &test{foobar: "foobar"}, nil }) value := MustInvokeNamed[*test](injector, "my_service") fmt.Println(value)
Output: &{foobar}
func MustInvokeStruct ΒΆ
InvokeStruct invokes services located in struct properties. The struct fields must be tagged with `do:""` or `do:"name"`, where `name` is the service name in the DI container. If the service is not found in the DI container, an error is returned. If the service is found but not assignable to the struct field, an error is returned. It panics on error.
func MustShutdown ΒΆ
MustShutdown stops a service, using type inference to determine the service name. It panics on error.
func MustShutdownNamed ΒΆ
MustShutdownNamed stops a named service. It panics on error.
func MustShutdownNamedWithContext ΒΆ
MustShutdownNamedWithContext stops a named service. It panics on error.
func MustShutdownWithContext ΒΆ
MustShutdownWithContext stops a service, using type inference to determine the service name. It panics on error.
func NameOf ΒΆ
NameOf returns the name of the service in the DI container. This is higly discouraged to use this function, as your code should not declare any dependency explicitly.
func Override ΒΆ
Override replaces the service in the DI container, using type inference to determine the service name.
Example ΒΆ
injector := New() type test struct { foobar string } Provide(injector, func(i Injector) (*test, error) { return &test{foobar: "foobar1"}, nil }) Override(injector, func(i Injector) (*test, error) { return &test{foobar: "foobar2"}, nil }) value, err := Invoke[*test](injector) fmt.Println(value) fmt.Println(err)
Output: &{foobar2} <nil>
func OverrideNamed ΒΆ
OverrideNamed replaces the named service in the DI container.
Example ΒΆ
injector := New() type test struct { foobar string } ProvideNamed(injector, "my_service", func(i Injector) (*test, error) { return &test{foobar: "foobar1"}, nil }) OverrideNamed(injector, "my_service", func(i Injector) (*test, error) { return &test{foobar: "foobar2"}, nil }) value, err := InvokeNamed[*test](injector, "my_service") fmt.Println(value) fmt.Println(err)
Output: &{foobar2} <nil>
func OverrideNamedTransient ΒΆ
OverrideNamedTransient replaces the named factory in the DI container.
func OverrideNamedValue ΒΆ
OverrideNamedValue replaces the named value in the DI container.
Example ΒΆ
injector := New() type test struct { foobar string } ProvideNamedValue(injector, "my_service", &test{foobar: "foobar1"}) OverrideNamedValue(injector, "my_service", &test{foobar: "foobar2"}) value, err := InvokeNamed[*test](injector, "my_service") fmt.Println(value) fmt.Println(err)
Output: &{foobar2} <nil>
func OverrideTransient ΒΆ
OverrideTransient replaces the factory in the DI container, using type inference to determine the service name.
func OverrideValue ΒΆ
OverrideValue replaces the value in the DI container, using type inference to determine the service name.
func Provide ΒΆ
Provide registers a service in the DI container, using type inference.
Example ΒΆ
injector := New() type test struct { foobar string } Provide(injector, func(i Injector) (*test, error) { return &test{foobar: "foobar"}, nil }) value, err := Invoke[*test](injector) fmt.Println(value) fmt.Println(err)
Output: &{foobar} <nil>
func ProvideNamed ΒΆ
ProvideNamed registers a named service in the DI container.
Example ΒΆ
injector := New() type test struct { foobar string } ProvideNamed(injector, "my_service", func(i Injector) (*test, error) { return &test{foobar: "foobar"}, nil }) value, err := InvokeNamed[*test](injector, "my_service") fmt.Println(value) fmt.Println(err)
Output: &{foobar} <nil>
func ProvideNamedTransient ΒΆ
ProvideNamedTransient registers a named factory in the DI container.
func ProvideNamedValue ΒΆ
ProvideNamedValue registers a named value in the DI container.
Example ΒΆ
injector := New() type test struct { foobar string } ProvideNamedValue(injector, "my_service", &test{foobar: "foobar"}) value, err := InvokeNamed[*test](injector, "my_service") fmt.Println(value) fmt.Println(err)
Output: &{foobar} <nil>
func ProvideTransient ΒΆ
ProvideTransient registers a factory in the DI container, using type inference to determine the service name.
func ProvideValue ΒΆ
ProvideValue registers a value in the DI container, using type inference to determine the service name.
Example ΒΆ
injector := New() type test struct { foobar string } ProvideValue(injector, &test{foobar: "foobar"}) value, err := Invoke[*test](injector) fmt.Println(value) fmt.Println(err)
Output: &{foobar} <nil>
func ShutdownNamed ΒΆ
ShutdownNamed stops a named service.
func ShutdownNamedWithContext ΒΆ
ShutdownNamedWithContext stops a named service.
func ShutdownWithContext ΒΆ
ShutdownWithContext stops a service, using type inference to determine the service name.
Types ΒΆ
type DAG ΒΆ
type DAG struct {
// contains filtered or unexported fields
}
DAG represents a Directed Acyclic Graph of services, tracking dependencies and dependents.
type EdgeService ΒΆ
EdgeService represents a service in the DAG, identified by scope ID, scope name, and service name.
type ExplainInjectorOutput ΒΆ
type ExplainInjectorOutput struct { ScopeID string `json:"scope_id"` ScopeName string `json:"scope_name"` DAG []ExplainInjectorScopeOutput `json:"dag"` }
func ExplainInjector ΒΆ
func ExplainInjector(scope Injector) ExplainInjectorOutput
ExplainInjector returns a human readable description of the injector, with services and scope tree.
func (*ExplainInjectorOutput) String ΒΆ
func (id *ExplainInjectorOutput) String() string
type ExplainInjectorScopeOutput ΒΆ
type ExplainInjectorScopeOutput struct { ScopeID string `json:"scope_id"` ScopeName string `json:"scope_name"` Scope Injector `json:"scope"` Services []ExplainInjectorServiceOutput `json:"services"` Children []ExplainInjectorScopeOutput `json:"children"` IsAncestor bool `json:"is_ancestor"` IsChildren bool `json:"is_children"` }
func (*ExplainInjectorScopeOutput) String ΒΆ
func (ids *ExplainInjectorScopeOutput) String() string
type ExplainInjectorServiceOutput ΒΆ
type ExplainInjectorServiceOutput struct { ServiceName string `json:"service_name"` ServiceType ServiceType `json:"service_type"` ServiceTypeIcon string `json:"service_type_icon"` ServiceBuildTime time.Duration `json:"service_build_time,omitempty"` IsHealthchecker bool `json:"is_healthchecker"` IsShutdowner bool `json:"is_shutdowner"` }
func (*ExplainInjectorServiceOutput) String ΒΆ
func (idss *ExplainInjectorServiceOutput) String() string
type ExplainServiceDependencyOutput ΒΆ
type ExplainServiceDependencyOutput struct { ScopeID string `json:"scope_id"` ScopeName string `json:"scope_name"` Service string `json:"service"` Recursive []ExplainServiceDependencyOutput `json:"recursive"` }
func (*ExplainServiceDependencyOutput) String ΒΆ
func (sdd *ExplainServiceDependencyOutput) String() string
type ExplainServiceOutput ΒΆ
type ExplainServiceOutput struct { ScopeID string `json:"scope_id"` ScopeName string `json:"scope_name"` ServiceName string `json:"service_name"` ServiceType ServiceType `json:"service_type"` ServiceBuildTime time.Duration `json:"service_build_time,omitempty"` Invoked *stacktrace.Frame `json:"invoked"` Dependencies []ExplainServiceDependencyOutput `json:"dependencies"` Dependents []ExplainServiceDependencyOutput `json:"dependents"` }
func ExplainNamedService ΒΆ
func ExplainNamedService(scope Injector, name string) (description ExplainServiceOutput, ok bool)
ExplainNamedService returns a human readable description of the service. It returns false if the service is not found. Please call Invoke[T] before ExplainNamedService[T] to ensure that the service is registered.
func ExplainService ΒΆ
func ExplainService[T any](i Injector) (description ExplainServiceOutput, ok bool)
ExplainService returns a human readable description of the service. It returns false if the service is not found. Please call Invoke[T] before ExplainService[T] to ensure that the service is registered.
func (*ExplainServiceOutput) String ΒΆ
func (sd *ExplainServiceOutput) String() string
type Healthchecker ΒΆ
type Healthchecker interface {
HealthCheck() error
}
type Injector ΒΆ
type Injector interface { // api ID() string Name() string Scope(string, ...func(Injector)) *Scope RootScope() *RootScope Ancestors() []*Scope Children() []*Scope ChildByID(string) (*Scope, bool) ChildByName(string) (*Scope, bool) ListProvidedServices() []EdgeService ListInvokedServices() []EdgeService HealthCheck() map[string]error HealthCheckWithContext(context.Context) map[string]error Shutdown() *ShutdownErrors ShutdownWithContext(context.Context) *ShutdownErrors // contains filtered or unexported methods }
Injector is a DI container.
type InjectorOpts ΒΆ
type InjectorOpts struct { HookBeforeRegistration []func(scope *Scope, serviceName string) HookAfterRegistration []func(scope *Scope, serviceName string) HookBeforeInvocation []func(scope *Scope, serviceName string) HookAfterInvocation []func(scope *Scope, serviceName string, err error) HookBeforeShutdown []func(scope *Scope, serviceName string) HookAfterShutdown []func(scope *Scope, serviceName string, err error) Logf func(format string, args ...any) HealthCheckParallelism uint // default: all jobs are executed in parallel HealthCheckGlobalTimeout time.Duration // default: no timeout HealthCheckTimeout time.Duration // default: no timeout StructTagKey string }
type RootScope ΒΆ
type RootScope struct {
// contains filtered or unexported fields
}
RootScope is the first level of scope tree.
func NewWithOpts ΒΆ
func NewWithOpts(opts *InjectorOpts, packages ...func(Injector)) *RootScope
NewWithOpts creates a new injector with options.
func (*RootScope) AddAfterInvocationHook ΒΆ
AddAfterInvocationHook adds a hook that will be called after a service is invoked.
func (*RootScope) AddAfterRegistrationHook ΒΆ
AddAfterRegistrationHook adds a hook that will be called after a service is registered.
func (*RootScope) AddAfterShutdownHook ΒΆ
AddAfterShutdownHook adds a hook that will be called after a service is shutdown.
func (*RootScope) AddBeforeInvocationHook ΒΆ
AddBeforeInvocationHook adds a hook that will be called before a service is invoked.
func (*RootScope) AddBeforeRegistrationHook ΒΆ
AddBeforeRegistrationHook adds a hook that will be called before a service is registered.
func (*RootScope) AddBeforeShutdownHook ΒΆ
AddBeforeShutdownHook adds a hook that will be called before a service is shutdown.
func (*RootScope) Clone ΒΆ
Clone clones injector with provided services but not with invoked instances.
func (*RootScope) CloneWithOpts ΒΆ
func (s *RootScope) CloneWithOpts(opts *InjectorOpts) *RootScope
CloneWithOpts clones injector with provided services but not with invoked instances, with options.
func (*RootScope) HealthCheck ΒΆ
func (*RootScope) HealthCheckWithContext ΒΆ
func (*RootScope) ListInvokedServices ΒΆ
func (s *RootScope) ListInvokedServices() []EdgeService
func (*RootScope) ListProvidedServices ΒΆ
func (s *RootScope) ListProvidedServices() []EdgeService
func (*RootScope) Shutdown ΒΆ
func (s *RootScope) Shutdown() *ShutdownErrors
func (*RootScope) ShutdownOnSignals ΒΆ
ShutdownOnSignals listens for signals defined in signals parameter in order to graceful stop service. It will block until receiving any of these signal. If no signal is provided in signals parameter, syscall.SIGTERM and os.Interrupt will be added as default signal.
func (*RootScope) ShutdownOnSignalsWithContext ΒΆ
func (s *RootScope) ShutdownOnSignalsWithContext(ctx context.Context, signals ...os.Signal) (os.Signal, *ShutdownErrors)
ShutdownOnSignalsWithContext listens for signals defined in signals parameter in order to graceful stop service. It will block until receiving any of these signal. If no signal is provided in signals parameter, syscall.SIGTERM and os.Interrupt will be added as default signal.
func (*RootScope) ShutdownWithContext ΒΆ
func (s *RootScope) ShutdownWithContext(ctx context.Context) *ShutdownErrors
type Scope ΒΆ
type Scope struct {
// contains filtered or unexported fields
}
Scope is a DI container. It must be created with injector.Scope("name") method.
func (*Scope) ChildByName ΒΆ
ChildByName returns the child scope recursively by its name.
func (*Scope) HealthCheck ΒΆ
HealthCheck returns the healthcheck results of the scope, in a map of service name to error.
func (*Scope) HealthCheckWithContext ΒΆ
HealthCheckWithContext returns the healthcheck results of the scope, in a map of service name to error.
func (*Scope) ListInvokedServices ΒΆ
func (s *Scope) ListInvokedServices() []EdgeService
ListInvokedServices returns the list of services invoked by the scope.
func (*Scope) ListProvidedServices ΒΆ
func (s *Scope) ListProvidedServices() []EdgeService
ListProvidedServices returns the list of services provided by the scope.
func (*Scope) Shutdown ΒΆ
func (s *Scope) Shutdown() *ShutdownErrors
Shutdown shutdowns the scope and all its children.
func (*Scope) ShutdownWithContext ΒΆ
func (s *Scope) ShutdownWithContext(ctx context.Context) *ShutdownErrors
ShutdownWithContext shutdowns the scope and all its children.
type ServiceAny ΒΆ
type ServiceAny interface {
// contains filtered or unexported methods
}
Like Service[T] but without the generic type.
type ServiceType ΒΆ
type ServiceType string
const ( ServiceTypeLazy ServiceType = "lazy" ServiceTypeEager ServiceType = "eager" ServiceTypeTransient ServiceType = "transient" ServiceTypeAlias ServiceType = "alias" )
type ShutdownErrors ΒΆ
type ShutdownErrors map[EdgeService]error
func (*ShutdownErrors) Add ΒΆ
func (e *ShutdownErrors) Add(scopeID string, scopeName string, serviceName string, err error)
func (ShutdownErrors) Error ΒΆ
func (e ShutdownErrors) Error() string
func (ShutdownErrors) Len ΒΆ
func (e ShutdownErrors) Len() int
type Shutdowner ΒΆ
type Shutdowner interface {
Shutdown()
}
type ShutdownerWithContext ΒΆ
type ShutdownerWithError ΒΆ
type ShutdownerWithError interface {
Shutdown() error
}
Source Files ΒΆ
- dag.go
- di.go
- di_alias.go
- di_explain.go
- di_lifecycle.go
- errors.go
- injector.go
- injector_test_example.go
- invoke.go
- options.go
- package.go
- provider.go
- root_scope.go
- root_scope_test_example.go
- scope.go
- service.go
- service_alias.go
- service_eager.go
- service_lazy.go
- service_transient.go
- utils.go
- virtual_scope.go