GitHub - boost-ext/di: C++14 Dependency Injection library (original) (raw)

Boost Licence Version Linux Coveralls Try it online


boost-ext.di

Your C++14 one header only Dependency Injection library with no dependencies

Dependency Injection

https://www.youtube.com/watch?v=yVogS4NbL6U


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

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(); }

Run this example on Wandbox.

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>(); }

Run this example on Wandbox.

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 }

Run this example on Wandbox.

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(); }

Run this example on Wandbox.

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


Disclaimer boost-ext.di is not an official Boost library.