GitHub - boost-ext/di: C++14 Dependency Injection library (original) (raw)
boost-ext.di
Your C++14 one header only Dependency Injection library with no dependencies
Quick start
Download
boost-ext.di requires only one file. Get the latest header here!
Include
#include <boost/di.hpp> namespace di = boost::di;
Compile
- GCC/Clang
$CXX -std=c++14 -O2 -fno-exceptions -fno-rtti -Wall -Werror -pedantic-errors file.cpp - MSVC
cl /std:c++14 /Ox /W3 file.cpp
Quick guide - Create object graph
class ctor { public: explicit ctor(int i) : i(i) {} int i; };
struct aggregate { double d; };
class example { public: example(aggregate a, const ctor& c) { assert(87.0 == a.d); assert(42 == c.i); }; };
int main() { const auto injector = di::make_injector( di::bind.to(42), di::bind.to(87.0) );
injector.create(); }
| Clang-3.8 | GCC-6 | MSVC-2015 | |
|---|---|---|---|
| Compilation Time | 0.102s | 0.118s | 0.296s |
| Binary size (stripped) | 6.2kb | 6.2kb | 105kb |
| ASM x86-64 | xor eax, eax retq |
Quick guide - Bind interfaces
struct interface { virtual ~interface() noexcept = default; virtual int get() const = 0; };
class implementation : public interface { public: int get() const override { return 42; } };
struct example { example(std::shared_ptr i) { assert(42 == i->get()); } };
int main() { const auto injector = di::make_injector( di::bind.to() );
injector.create<std::unique_ptr>(); }
| Clang-3.8 | GCC-6 | MSVC-2015 | |
|---|---|---|---|
| Compilation Time | 0.102s | 0.118s | 0.296s |
| Binary size (stripped) | 6.2kb | 6.2kb | 105kb |
| ASM x86-64 (same as `make_unique`) | push %rbx mov %rdi,%rbx mov 0x8,0x8,%edi callq 0x4008e0 <_Znwm@plt> movq 0x8,0x400c78,(%rax) mov %rax,(%rbx) mov %rbx,%rax pop %rbx retq |
Quick guide - Bind templates
template class simple_updater { public: void update() const { ErrorPolicy::on("update"); } };
template class example { public: explicit example(const Updater& updater) : updater(updater) { }
void update() { updater.update(); }
private: const Updater& updater; };
int main() { struct throw_policy { static void on(const std::string& str) { throw std::runtime_error(str); } };
const auto injector = di::make_injector( di::bind.to(), di::bind.to() );
injector.create().update(); // Terminates with an uncaught exception because of our bound error policy }
| Clang-3.8 | GCC-6 | MSVC-2015 | |
|---|---|---|---|
| Compilation Time | 0.102s | 0.118s | 0.296s |
| Binary size (stripped) | 6.2kb | 6.2kb | 105kb |
| ASM x86-64 | xor eax, eax retq |
Quick guide - Bind concepts
struct Streamable { template auto requires(T&& t) -> decltype( int( t.read() ), t.write(int) ); };
template<class Exchange = Streamable(class ExchangeStream) class Engine = Streamable(class EngineStream)> class example { public: example(Exchange exchange, Engine engine) : exchange(std::move(exchange)), engine(std::move(engine)) { }
private: Exchange exchange; Engine engine; };
int main() { const auto injector = di::make_injector( di::bind<Streamable(class ExchangeStream)>.to(), di::bind<Streamable(class EngineStream)>.to() );
injector.create(); }
| Clang-3.8 | GCC-6 | MSVC-2015 | |
|---|---|---|---|
| Compilation Time | 0.102s | 0.118s | 0.296s |
| Binary size (stripped) | 6.2kb | 6.2kb | 105kb |
| ASM x86-64 | xor eax, eax retq |
Documentation
- Introduction
- Do I use a Dependency Injection already?
- Do I use Dependency Injection correctly?
- Do I need a Dependency Injection?
- STUPID vs SOLID - "Clean Code" Uncle Bob
- Do I need a DI Framework/Library?
- Manual DI - Wiring Mess (Avoid it by using [Boost].DI)
- Real Life examples?
- Why [Boost].DI?
- [Boost].DI design goals
- Articles
- Videos
- [Boost::ext].DI
- Dependency Injection In General
- Acknowledgements
- Overview
- Tutorial
- Try It Online!
- Benchmarks
- User Guide
- Examples
- Hello World
- Bindings
- Dynamic Bindings
- Forward Bindings
- Is Creatable
- Multiple Bindings
- Binding Non-owning Pointer
- Binding Templates
- Binding To Constructor
- Automatic Injection
- Constructor Signature
- Constructor Injection
- Multiple Interface
- Annotations
- Deduce Scope
- Custom Scope
- Eager Singletons
- Modules
- Modules (hpp/cpp)
- Custom Policy
- Custom Provider
- Pool Provider
- Configuration
- Polymorphism
- Inheritance
- Type Erasure
- Function
- Variant
- Templates
- Concepts
- Extensions
- FAQ
- CHANGELOG
Disclaimer boost-ext.di is not an official Boost library.
