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:
- To do:
@Injectconstructor injectionProvider<T>create multiple instances at run time.Lazy<T>create and cache instance only when used.- Subcomponents Dynamically creatable sub-scopes with additional bindings
- Multibindings Collect same bindings to a set/map, useful for plugin systems.
@BindsOptionalOfAllow some bindings to be missing- Factories create objects with both injected fields and runtime fields.
- Producers async dependency injection. Might not be too useful comparing to async/await
See user guide for more information.
Example:
use *;
use Add;
// 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.
// A list of modules.
// Components stitch modules and injectables together into a dependency graph, and can create
// objects in the graph. This coponent installs modules listed in ModuleManifest, which is MyModule.
// 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.