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 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 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 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
- 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) 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) *Scope
- func (s *RootScope) Shutdown() map[string]error
- func (s *RootScope) ShutdownOnSignals(signals ...os.Signal) (os.Signal, map[string]error)
- func (s *RootScope) ShutdownOnSignalsWithContext(ctx context.Context, signals ...os.Signal) (os.Signal, map[string]error)
- func (s *RootScope) ShutdownWithContext(ctx context.Context) map[string]error
- 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) *Scope
- func (s *Scope) Shutdown() map[string]error
- func (s *Scope) ShutdownWithContext(ctx context.Context) map[string]error
- type Service
- type ServiceAny
- type ServiceType
- 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")
Functions ¶
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.
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) *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() map[string]error ShutdownWithContext(context.Context) map[string]error // contains filtered or unexported methods }
Injector is a DI container.
type InjectorOpts ¶
type InjectorOpts struct { HookAfterRegistration func(scope *Scope, serviceName string) HookAfterShutdown func(scope *Scope, serviceName string) 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) *RootScope
NewWithOpts creates a new injector with options.
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) 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, map[string]error)
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.
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.
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 Shutdowner ¶
type Shutdowner interface {
Shutdown()
}
type ShutdownerWithContext ¶
type ShutdownerWithError ¶
type ShutdownerWithError interface {
Shutdown() error
}