Documentation
¶
Overview ¶
Package di implements functions and data types supporting dependency injection patterns.
Overview ¶
The dependency injection (DI) framework provides a type-safe way to manage dependencies between components in your application. It ensures that all dependencies are resolved correctly and that instances are created as singletons.
Core Concepts ¶
Dependency - An abstract concept representing a service, function, or value with a specific type. Dependencies can be:
- Simple values (API URLs, configuration strings, numbers)
- Complex objects (HTTP clients, database connections)
- Service interfaces
- Functions
InjectionToken - A unique identifier for a dependency that includes type information. Created using MakeToken[T](name).
Provider - The implementation of a dependency. Providers specify:
- Which dependency they provide (via an InjectionToken)
- What other dependencies they need
- How to create the instance
InjectableFactory - The container that manages all providers and resolves dependencies. All resolved instances are singletons.
Basic Usage ¶
Creating and using dependencies:
import (
"github.com/IBM/fp-go/v2/di"
IOE "github.com/IBM/fp-go/v2/ioeither"
)
// Define injection tokens
var (
ConfigToken = di.MakeToken[Config]("Config")
DBToken = di.MakeToken[Database]("Database")
APIToken = di.MakeToken[APIService]("APIService")
)
// Create providers
configProvider := di.ConstProvider(ConfigToken, Config{Port: 8080})
dbProvider := di.MakeProvider1(
DBToken,
ConfigToken.Identity(),
func(cfg Config) IOResult[Database] {
return ioresult.Of(NewDatabase(cfg))
},
)
apiProvider := di.MakeProvider2(
APIToken,
ConfigToken.Identity(),
DBToken.Identity(),
func(cfg Config, db Database) IOResult[APIService] {
return ioresult.Of(NewAPIService(cfg, db))
},
)
// Create injector and resolve
injector := DIE.MakeInjector([]DIE.Provider{
configProvider,
dbProvider,
apiProvider,
})
// Resolve the API service
resolver := di.Resolve(APIToken)
result := resolver(injector)()
Dependency Types ¶
Identity (Required) - The dependency must be resolved, or the injection fails:
token.Identity() // Returns Dependency[T]
Option (Optional) - The dependency is optional, returns Option[T]:
token.Option() // Returns Dependency[Option[T]]
IOEither (Lazy Required) - Lazy evaluation, memoized singleton:
token.IOEither() // Returns Dependency[IOEither[error, T]]
IOOption (Lazy Optional) - Lazy optional evaluation:
token.IOOption() // Returns Dependency[IOOption[T]]
Provider Creation ¶
Providers are created using MakeProvider functions with suffixes indicating the number of dependencies (0-15):
MakeProvider0 - No dependencies:
provider := di.MakeProvider0( token, ioresult.Of(value), )
MakeProvider1 - One dependency:
provider := di.MakeProvider1(
resultToken,
dep1Token.Identity(),
func(dep1 Dep1Type) IOResult[ResultType] {
return ioresult.Of(createResult(dep1))
},
)
MakeProvider2 - Two dependencies:
provider := di.MakeProvider2(
resultToken,
dep1Token.Identity(),
dep2Token.Identity(),
func(dep1 Dep1Type, dep2 Dep2Type) IOResult[ResultType] {
return ioresult.Of(createResult(dep1, dep2))
},
)
Constant Providers ¶
For simple constant values:
provider := di.ConstProvider(token, value)
Default Implementations ¶
Tokens can have default implementations that are used when no explicit provider is registered:
token := di.MakeTokenWithDefault0(
"ServiceName",
ioresult.Of(defaultImplementation),
)
// Or with dependencies
token := di.MakeTokenWithDefault2(
"ServiceName",
dep1Token.Identity(),
dep2Token.Identity(),
func(dep1 Dep1Type, dep2 Dep2Type) IOResult[ResultType] {
return ioresult.Of(createDefault(dep1, dep2))
},
)
Multi-Value Dependencies ¶
For dependencies that can have multiple implementations:
// Create a multi-token
loggersToken := di.MakeMultiToken[Logger]("Loggers")
// Provide multiple items
consoleLogger := di.ConstProvider(loggersToken.Item(), ConsoleLogger{})
fileLogger := di.ConstProvider(loggersToken.Item(), FileLogger{})
// Resolve all items as an array
resolver := di.Resolve(loggersToken.Container())
loggers := resolver(injector)() // Returns []Logger
Lazy vs Eager Resolution ¶
Eager (Identity/Option) - Resolved immediately when the injector is created:
dep1Token.Identity() // Resolved eagerly dep2Token.Option() // Resolved eagerly
Lazy (IOEither/IOOption) - Resolved only when accessed:
dep3Token.IOEither() // Resolved lazily dep4Token.IOOption() // Resolved lazily
Lazy dependencies are memoized, so they're only created once.
Main Application Pattern ¶
The framework provides a convenient pattern for running applications:
import (
"github.com/IBM/fp-go/v2/di"
IOE "github.com/IBM/fp-go/v2/ioeither"
)
// Define your main application logic
mainProvider := di.MakeProvider1(
di.InjMain,
APIToken.Identity(),
func(api APIService) IOResult[any] {
return ioresult.Of(api.Start())
},
)
// Run the application
err := di.RunMain([]DIE.Provider{
configProvider,
dbProvider,
apiProvider,
mainProvider,
})()
Practical Examples ¶
Example 1: Configuration-based Service
type Config struct {
APIKey string
Timeout int
}
type HTTPClient struct {
config Config
}
var (
ConfigToken = di.MakeToken[Config]("Config")
ClientToken = di.MakeToken[HTTPClient]("HTTPClient")
)
configProvider := di.ConstProvider(ConfigToken, Config{
APIKey: "secret",
Timeout: 30,
})
clientProvider := di.MakeProvider1(
ClientToken,
ConfigToken.Identity(),
func(cfg Config) IOResult[HTTPClient] {
return ioresult.Of(HTTPClient{config: cfg})
},
)
Example 2: Optional Dependencies
var (
CacheToken = di.MakeToken[Cache]("Cache")
ServiceToken = di.MakeToken[Service]("Service")
)
// Service works with or without cache
serviceProvider := di.MakeProvider1(
ServiceToken,
CacheToken.Option(), // Optional dependency
func(cache Option[Cache]) IOResult[Service] {
return ioresult.Of(NewService(cache))
},
)
Example 3: Lazy Dependencies
var (
DBToken = di.MakeToken[Database]("Database")
ReporterToken = di.MakeToken[Reporter]("Reporter")
)
// Reporter only connects to DB when needed
reporterProvider := di.MakeProvider1(
ReporterToken,
DBToken.IOEither(), // Lazy dependency
func(dbIO IOResult[Database]) IOResult[Reporter] {
return ioresult.Of(NewReporter(dbIO))
},
)
Function Reference ¶
Token Creation:
- MakeToken[T](name) InjectionToken[T] - Creates a unique injection token
- MakeTokenWithDefault[T](name, factory) InjectionToken[T] - Token with default implementation
- MakeTokenWithDefault0-15 - Token with default and N dependencies
- MakeMultiToken[T](name) MultiInjectionToken[T] - Token for multiple implementations
Provider Creation:
- ConstProvider[T](token, value) Provider - Simple constant provider
- MakeProvider0[R](token, factory) Provider - Provider with no dependencies
- MakeProvider1-15 - Providers with 1-15 dependencies
- MakeProviderFactory0-15 - Lower-level factory creation
Resolution:
- Resolve[T](token) ReaderIOEither[InjectableFactory, error, T] - Resolves a dependency
Application:
- InjMain - Injection token for main application
- Main - Resolver for main application
- RunMain(providers) IO[error] - Runs the main application
Utility:
- asDependency[T](t) Dependency - Converts to dependency interface
Related Packages ¶
- github.com/IBM/fp-go/v2/di/erasure - Type-erased DI implementation
- github.com/IBM/fp-go/v2/ioeither - IO operations with error handling
- github.com/IBM/fp-go/v2/option - Optional values
- github.com/IBM/fp-go/v2/either - Either monad for error handling
[Provider]: github.com/IBM/fp-go/v2/di/erasure.Provider [InjectableFactory]: github.com/IBM/fp-go/v2/di/erasure.InjectableFactory [MakeInjector]: github.com/IBM/fp-go/v2/di/erasure.MakeInjector
Index ¶
- Variables
- func ConstProvider[R any](token InjectionToken[R], value R) DIE.Provider
- func MakeProvider0[R any](token InjectionToken[R], fct IOResult[R]) DIE.Provider
- func MakeProvider1[T1 any, R any](token InjectionToken[R], d1 Dependency[T1], f func(T1) IOResult[R]) DIE.Provider
- func MakeProvider10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider2[T1, T2 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider3[T1, T2, T3 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider4[T1, T2, T3, T4 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider5[T1, T2, T3, T4, T5 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider6[T1, T2, T3, T4, T5, T6 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider7[T1, T2, T3, T4, T5, T6, T7 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider8[T1, T2, T3, T4, T5, T6, T7, T8 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProvider9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any, R any](token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], ...) DIE.Provider
- func MakeProviderFactory0[R any](fct IOResult[R]) DIE.ProviderFactory
- func MakeProviderFactory1[T1 any, R any](d1 Dependency[T1], f func(T1) IOResult[R]) DIE.ProviderFactory
- func MakeProviderFactory10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory2[T1, T2 any, R any](d1 Dependency[T1], d2 Dependency[T2], f func(T1, T2) IOResult[R]) DIE.ProviderFactory
- func MakeProviderFactory3[T1, T2, T3 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) DIE.ProviderFactory
- func MakeProviderFactory4[T1, T2, T3, T4 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory5[T1, T2, T3, T4, T5 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory6[T1, T2, T3, T4, T5, T6 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory7[T1, T2, T3, T4, T5, T6, T7 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory8[T1, T2, T3, T4, T5, T6, T7, T8 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func MakeProviderFactory9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any, R any](d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], ...) DIE.ProviderFactory
- func Resolve[T any](token InjectionToken[T]) RIOR.ReaderIOResult[DIE.InjectableFactory, T]
- type Dependency
- type Entry
- type IOOption
- type IOResult
- type InjectionToken
- func MakeToken[T any](name string) InjectionToken[T]
- func MakeTokenWithDefault[T any](name string, providerFactory DIE.ProviderFactory) InjectionToken[T]
- func MakeTokenWithDefault0[R any](name string, fct IOResult[R]) InjectionToken[R]
- func MakeTokenWithDefault1[T1 any, R any](name string, d1 Dependency[T1], f func(T1) IOResult[R]) InjectionToken[R]
- func MakeTokenWithDefault10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault2[T1, T2 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], f func(T1, T2) IOResult[R]) InjectionToken[R]
- func MakeTokenWithDefault3[T1, T2, T3 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault4[T1, T2, T3, T4 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault5[T1, T2, T3, T4, T5 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault6[T1, T2, T3, T4, T5, T6 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault7[T1, T2, T3, T4, T5, T6, T7 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault8[T1, T2, T3, T4, T5, T6, T7, T8 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- func MakeTokenWithDefault9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any, R any](name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], ...) InjectionToken[R]
- type MultiInjectionToken
- type Option
- type Result
Constants ¶
This section is empty.
Variables ¶
var ( // InjMain is the [InjectionToken] for the main application InjMain = MakeToken[any]("APP") // Main is the resolver for the main application Main = Resolve(InjMain) )
var RunMain = F.Flow3( DIE.MakeInjector, Main, IOR.Fold(IO.Of[error], F.Constant1[any](IO.Of[error](nil))), )
RunMain runs the main application from a set of [DIE.Provider]s
Functions ¶
func ConstProvider ¶
func ConstProvider[R any](token InjectionToken[R], value R) DIE.Provider
ConstProvider simple implementation for a provider with a constant value
func MakeProvider0 ¶
func MakeProvider0[R any]( token InjectionToken[R], fct IOResult[R], ) DIE.Provider
func MakeProvider1 ¶
func MakeProvider1[T1 any, R any]( token InjectionToken[R], d1 Dependency[T1], f func(T1) IOResult[R], ) DIE.Provider
MakeProvider1 creates a [DIE.Provider] for an InjectionToken from a function with 1 dependencies
func MakeProvider10 ¶
func MakeProvider10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) IOResult[R], ) DIE.Provider
MakeProvider10 creates a [DIE.Provider] for an InjectionToken from a function with 10 dependencies
func MakeProvider11 ¶
func MakeProvider11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) IOResult[R], ) DIE.Provider
MakeProvider11 creates a [DIE.Provider] for an InjectionToken from a function with 11 dependencies
func MakeProvider12 ¶
func MakeProvider12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) IOResult[R], ) DIE.Provider
MakeProvider12 creates a [DIE.Provider] for an InjectionToken from a function with 12 dependencies
func MakeProvider13 ¶
func MakeProvider13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) IOResult[R], ) DIE.Provider
MakeProvider13 creates a [DIE.Provider] for an InjectionToken from a function with 13 dependencies
func MakeProvider14 ¶
func MakeProvider14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], d14 Dependency[T14], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) IOResult[R], ) DIE.Provider
MakeProvider14 creates a [DIE.Provider] for an InjectionToken from a function with 14 dependencies
func MakeProvider15 ¶
func MakeProvider15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], d14 Dependency[T14], d15 Dependency[T15], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) IOResult[R], ) DIE.Provider
MakeProvider15 creates a [DIE.Provider] for an InjectionToken from a function with 15 dependencies
func MakeProvider2 ¶
func MakeProvider2[T1, T2 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], f func(T1, T2) IOResult[R], ) DIE.Provider
MakeProvider2 creates a [DIE.Provider] for an InjectionToken from a function with 2 dependencies
func MakeProvider3 ¶
func MakeProvider3[T1, T2, T3 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], f func(T1, T2, T3) IOResult[R], ) DIE.Provider
MakeProvider3 creates a [DIE.Provider] for an InjectionToken from a function with 3 dependencies
func MakeProvider4 ¶
func MakeProvider4[T1, T2, T3, T4 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], f func(T1, T2, T3, T4) IOResult[R], ) DIE.Provider
MakeProvider4 creates a [DIE.Provider] for an InjectionToken from a function with 4 dependencies
func MakeProvider5 ¶
func MakeProvider5[T1, T2, T3, T4, T5 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], f func(T1, T2, T3, T4, T5) IOResult[R], ) DIE.Provider
MakeProvider5 creates a [DIE.Provider] for an InjectionToken from a function with 5 dependencies
func MakeProvider6 ¶
func MakeProvider6[T1, T2, T3, T4, T5, T6 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], f func(T1, T2, T3, T4, T5, T6) IOResult[R], ) DIE.Provider
MakeProvider6 creates a [DIE.Provider] for an InjectionToken from a function with 6 dependencies
func MakeProvider7 ¶
func MakeProvider7[T1, T2, T3, T4, T5, T6, T7 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], f func(T1, T2, T3, T4, T5, T6, T7) IOResult[R], ) DIE.Provider
MakeProvider7 creates a [DIE.Provider] for an InjectionToken from a function with 7 dependencies
func MakeProvider8 ¶
func MakeProvider8[T1, T2, T3, T4, T5, T6, T7, T8 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], f func(T1, T2, T3, T4, T5, T6, T7, T8) IOResult[R], ) DIE.Provider
MakeProvider8 creates a [DIE.Provider] for an InjectionToken from a function with 8 dependencies
func MakeProvider9 ¶
func MakeProvider9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any, R any]( token InjectionToken[R], d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9) IOResult[R], ) DIE.Provider
MakeProvider9 creates a [DIE.Provider] for an InjectionToken from a function with 9 dependencies
func MakeProviderFactory0 ¶
func MakeProviderFactory0[R any]( fct IOResult[R], ) DIE.ProviderFactory
func MakeProviderFactory1 ¶
func MakeProviderFactory1[T1 any, R any]( d1 Dependency[T1], f func(T1) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory1 creates a [DIE.ProviderFactory] from a function with 1 arguments and 1 dependencies
func MakeProviderFactory10 ¶
func MakeProviderFactory10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory10 creates a [DIE.ProviderFactory] from a function with 10 arguments and 10 dependencies
func MakeProviderFactory11 ¶
func MakeProviderFactory11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory11 creates a [DIE.ProviderFactory] from a function with 11 arguments and 11 dependencies
func MakeProviderFactory12 ¶
func MakeProviderFactory12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory12 creates a [DIE.ProviderFactory] from a function with 12 arguments and 12 dependencies
func MakeProviderFactory13 ¶
func MakeProviderFactory13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory13 creates a [DIE.ProviderFactory] from a function with 13 arguments and 13 dependencies
func MakeProviderFactory14 ¶
func MakeProviderFactory14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], d14 Dependency[T14], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory14 creates a [DIE.ProviderFactory] from a function with 14 arguments and 14 dependencies
func MakeProviderFactory15 ¶
func MakeProviderFactory15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], d14 Dependency[T14], d15 Dependency[T15], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory15 creates a [DIE.ProviderFactory] from a function with 15 arguments and 15 dependencies
func MakeProviderFactory2 ¶
func MakeProviderFactory2[T1, T2 any, R any]( d1 Dependency[T1], d2 Dependency[T2], f func(T1, T2) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory2 creates a [DIE.ProviderFactory] from a function with 2 arguments and 2 dependencies
func MakeProviderFactory3 ¶
func MakeProviderFactory3[T1, T2, T3 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], f func(T1, T2, T3) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory3 creates a [DIE.ProviderFactory] from a function with 3 arguments and 3 dependencies
func MakeProviderFactory4 ¶
func MakeProviderFactory4[T1, T2, T3, T4 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], f func(T1, T2, T3, T4) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory4 creates a [DIE.ProviderFactory] from a function with 4 arguments and 4 dependencies
func MakeProviderFactory5 ¶
func MakeProviderFactory5[T1, T2, T3, T4, T5 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], f func(T1, T2, T3, T4, T5) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory5 creates a [DIE.ProviderFactory] from a function with 5 arguments and 5 dependencies
func MakeProviderFactory6 ¶
func MakeProviderFactory6[T1, T2, T3, T4, T5, T6 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], f func(T1, T2, T3, T4, T5, T6) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory6 creates a [DIE.ProviderFactory] from a function with 6 arguments and 6 dependencies
func MakeProviderFactory7 ¶
func MakeProviderFactory7[T1, T2, T3, T4, T5, T6, T7 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], f func(T1, T2, T3, T4, T5, T6, T7) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory7 creates a [DIE.ProviderFactory] from a function with 7 arguments and 7 dependencies
func MakeProviderFactory8 ¶
func MakeProviderFactory8[T1, T2, T3, T4, T5, T6, T7, T8 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], f func(T1, T2, T3, T4, T5, T6, T7, T8) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory8 creates a [DIE.ProviderFactory] from a function with 8 arguments and 8 dependencies
func MakeProviderFactory9 ¶
func MakeProviderFactory9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any, R any]( d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9) IOResult[R], ) DIE.ProviderFactory
MakeProviderFactory9 creates a [DIE.ProviderFactory] from a function with 9 arguments and 9 dependencies
func Resolve ¶
func Resolve[T any](token InjectionToken[T]) RIOR.ReaderIOResult[DIE.InjectableFactory, T]
Resolve performs a type safe resolution of a dependency
Types ¶
type Dependency ¶
type Dependency[T any] interface { DIE.Dependency // Unerase converts a value with erased type signature into a strongly typed value Unerase(val any) Result[T] }
Dependency describes the relationship to a service, that has a type and a behaviour such as required, option or lazy
type Entry ¶ added in v2.0.1
type Entry[K comparable, V any] = record.Entry[K, V]
Entry represents a key-value pair in a record/map structure.
type InjectionToken ¶
type InjectionToken[T any] interface { Dependency[T] // Identity idenifies this dependency as a mandatory, required dependency, it will be resolved eagerly and injected as `T`. // If the dependency cannot be resolved, the resolution process fails Identity() Dependency[T] // Option identifies this dependency as optional, it will be resolved eagerly and injected as [Option[T]]. // If the dependency cannot be resolved, the resolution process continues and the dependency is represented as [O.None[T]] Option() Dependency[Option[T]] // IOEither identifies this dependency as mandatory but it will be resolved lazily as a [IOResult[T]]. This // value is memoized to make sure the dependency is a singleton. // If the dependency cannot be resolved, the resolution process fails IOEither() Dependency[IOResult[T]] // IOOption identifies this dependency as optional but it will be resolved lazily as a [IOOption[T]]. This // value is memoized to make sure the dependency is a singleton. // If the dependency cannot be resolved, the resolution process continues and the dependency is represented as the none value. IOOption() Dependency[IOOption[T]] }
InjectionToken uniquely identifies a dependency by giving it an Id, Type and name
func MakeToken ¶
func MakeToken[T any](name string) InjectionToken[T]
MakeToken create a unique InjectionToken for a specific type
func MakeTokenWithDefault ¶
func MakeTokenWithDefault[T any](name string, providerFactory DIE.ProviderFactory) InjectionToken[T]
MakeToken create a unique InjectionToken for a specific type
func MakeTokenWithDefault0 ¶
func MakeTokenWithDefault0[R any](name string, fct IOResult[R]) InjectionToken[R]
MakeTokenWithDefault0 creates a unique InjectionToken for a specific type with an attached default [DIE.Provider]
func MakeTokenWithDefault1 ¶
func MakeTokenWithDefault1[T1 any, R any]( name string, d1 Dependency[T1], f func(T1) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault1 creates an InjectionToken with a default implementation with 1 dependencies
func MakeTokenWithDefault10 ¶
func MakeTokenWithDefault10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault10 creates an InjectionToken with a default implementation with 10 dependencies
func MakeTokenWithDefault11 ¶
func MakeTokenWithDefault11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault11 creates an InjectionToken with a default implementation with 11 dependencies
func MakeTokenWithDefault12 ¶
func MakeTokenWithDefault12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault12 creates an InjectionToken with a default implementation with 12 dependencies
func MakeTokenWithDefault13 ¶
func MakeTokenWithDefault13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault13 creates an InjectionToken with a default implementation with 13 dependencies
func MakeTokenWithDefault14 ¶
func MakeTokenWithDefault14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], d14 Dependency[T14], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault14 creates an InjectionToken with a default implementation with 14 dependencies
func MakeTokenWithDefault15 ¶
func MakeTokenWithDefault15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], d10 Dependency[T10], d11 Dependency[T11], d12 Dependency[T12], d13 Dependency[T13], d14 Dependency[T14], d15 Dependency[T15], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault15 creates an InjectionToken with a default implementation with 15 dependencies
func MakeTokenWithDefault2 ¶
func MakeTokenWithDefault2[T1, T2 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], f func(T1, T2) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault2 creates an InjectionToken with a default implementation with 2 dependencies
func MakeTokenWithDefault3 ¶
func MakeTokenWithDefault3[T1, T2, T3 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], f func(T1, T2, T3) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault3 creates an InjectionToken with a default implementation with 3 dependencies
func MakeTokenWithDefault4 ¶
func MakeTokenWithDefault4[T1, T2, T3, T4 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], f func(T1, T2, T3, T4) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault4 creates an InjectionToken with a default implementation with 4 dependencies
func MakeTokenWithDefault5 ¶
func MakeTokenWithDefault5[T1, T2, T3, T4, T5 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], f func(T1, T2, T3, T4, T5) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault5 creates an InjectionToken with a default implementation with 5 dependencies
func MakeTokenWithDefault6 ¶
func MakeTokenWithDefault6[T1, T2, T3, T4, T5, T6 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], f func(T1, T2, T3, T4, T5, T6) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault6 creates an InjectionToken with a default implementation with 6 dependencies
func MakeTokenWithDefault7 ¶
func MakeTokenWithDefault7[T1, T2, T3, T4, T5, T6, T7 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], f func(T1, T2, T3, T4, T5, T6, T7) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault7 creates an InjectionToken with a default implementation with 7 dependencies
func MakeTokenWithDefault8 ¶
func MakeTokenWithDefault8[T1, T2, T3, T4, T5, T6, T7, T8 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], f func(T1, T2, T3, T4, T5, T6, T7, T8) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault8 creates an InjectionToken with a default implementation with 8 dependencies
func MakeTokenWithDefault9 ¶
func MakeTokenWithDefault9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any, R any]( name string, d1 Dependency[T1], d2 Dependency[T2], d3 Dependency[T3], d4 Dependency[T4], d5 Dependency[T5], d6 Dependency[T6], d7 Dependency[T7], d8 Dependency[T8], d9 Dependency[T9], f func(T1, T2, T3, T4, T5, T6, T7, T8, T9) IOResult[R], ) InjectionToken[R]
MakeTokenWithDefault9 creates an InjectionToken with a default implementation with 9 dependencies
type MultiInjectionToken ¶
type MultiInjectionToken[T any] interface { // Container returns the injection token used to request an array of all provided items Container() InjectionToken[[]T] // Item returns the injection token used to provide an item Item() InjectionToken[T] }
MultiInjectionToken uniquely identifies a dependency by giving it an Id, Type and name that can have multiple implementations. Implementations are provided via the [MultiInjectionToken.Item] injection token.
func MakeMultiToken ¶
func MakeMultiToken[T any](name string) MultiInjectionToken[T]
MakeMultiToken creates a MultiInjectionToken