Lockjaw
Lockjaw is a fully static, compile-time dependency injection framework for Rust inspired by Dagger. It is also what you get when jabbed by a rusty dagger.
Features:
- Compile time dependency graph validation with helpful diagnostic messages. The code won't compile if a dependency is missing or there are cyclic dependencies.
- Cross-crate injection. Libraries can provide different implementations like prod and test, and allow clients to choose from them.
- Aims for feature parity with Dagger. If you have used Dagger before, lockjaw should feel familiar.
- Implemented:
@Inject
=>#[inject]
constructor injection in#[injectable]
@Provides
=>#[provides]
bind method return values@Binds
=>#[binds]
bind trait to implementation.@Singleton
/@Scope
=>scope=component
shared instance.@Named
=>#[qualified]
Provider<T>
=>Provider<T>
create multiple instances at run time.Lazy<T>
=>Lazy<T>
create and cache instance only when used.- Subcomponents
=>
#[subcomponent]
Dynamically creatable sub-scopes with additional bindings - Multibindings
=>
#[into_vec]
/#[into_map]
Collect same bindings to a Vec/HashMap, useful for plugin systems. @BindsOptionalOf
=>#[binds_option_of]
Allow some bindings to be missing- Factories
=>
#[facotry]
create objects with both injected fields and runtime fields. - Hilt
=>
#[define_component]
/#[entry_point
/install_in
Automatic module collection from build dependency.
- Todo
- Producers async dependency injection. Might not be too useful comparing to async/await
- Implemented:
See user guide for more information.
Example:
use *;
use Add;
prologue!;
// Allow GreetCounter to be created in the dependency graph. These bindings are available anywhere.
// Declare a module so we can do special bindings. These bindings are only available if the
// component installs the module, so different bindings can be used based on the situation.
// Components stitch modules and injectables together into a dependency graph, and can create
// objects in the graph. The component installs modules listed in `modules`
// called after the last use of lockjaw to perform validation and code generation
epilogue!;
Disclaimer
This is not an officially supported Google product.
Lockjaw is currently in early development and all APIs are subjected to changes. Some feature are also implemented in a hacky way. Use at your own risk.