Object dependency management system based on dry-container and dry-auto_inject allowing you to configure reusable components in any environment, set up their load-paths, require needed files and instantiate objects automatically with the ability to have them injected as dependencies.
This library relies on very basic mechanisms provided by Ruby, specifically
require and managing
$LOAD_PATH. It doesn’t use magic like automatic const resolution, it’s pretty much the opposite and forces you to be explicit about dependencies in your applications.
It does a couple of things for you:
- Provides an abstract dependency container implementation
- Loads needed files using
- Resolves object dependencies automatically
- Supports auto-registration of dependencies via file/dir naming conventions
- Supports multi-system setups (ie your application is split into multiple sub-systems)
To put it all together, this allows you to configure your system in a way where you have full control over dependencies and it’s very easy to draw the boundaries between individual components.
This comes with a bunch of nice benefits:
- Your system relies on abstractions rather than concrete classes and modules
- It helps in decoupling your code from 3rd party code
- It makes it possible to load components in complete isolation. In example you can run a single test for a single component and only required files will be loaded, or you can run a rake task and it will only load the things it needs.
- It opens up doors to better instrumentation and debugging tools
You can use
dry-system in a new application or add it to an existing application. It should Just Work™ but if it doesn’t please report an issue.
This library is the backbone of dry-web, if you’d like to see a full-blown application example check out Berg. Please notice that
dry-system is framework agnostic, in fact, it could be treated as a toolkit for building frameworks, as it provides facilities that are typically needed by frameworks.
There’s no dedicated railtie for
dry-system yet but we’d like to provide one at some point. Please get in touch if you’re interested in helping with this.