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
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
examples
|
|
|
dag
command
|
|
|
healthcheckable
command
|
|
|
interface
command
|
|
|
nested-scope
command
|
|
|
shutdownable
command
|
|
|
simple
command
|
|
|
struct
command
|
|
|
tests
|
|