Popularity
5.7
Growing
Activity
3.5
-
1,097
69
135

Description

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

Code Quality Rank: L3
Programming language: C++
Tags: Miscellaneous     DI     Testing     Design Patterns    
Latest version: v1.2.0

Experimental Boost.DI alternatives and similar libraries

Based on the "Miscellaneous" category.
Alternatively, view Experimental Boost.DI alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of Experimental Boost.DI or a related project?

Add another 'Miscellaneous' Library

README

Boost Licence Version Build Status Build Status Coveralls Github Issues Try it online


[Boost::ext].DI

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

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

  • GCC/Clang sh $CXX -std=c++14 -O2 -fno-exceptions -fno-rtti -Wall -Werror -pedantic-errors file.cpp
  • MSVC sh 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<int>.to(42),
    di::bind<double>.to(87.0)
  );

  injector.create<example>();
}

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<interface> i) {
    assert(42 == i->get());
  }
};

int main() {
  const auto injector = di::make_injector(
    di::bind<interface>.to<implementation>()
  );

  injector.create<std::unique_ptr<example>>();
}

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<example>) push %rbx mov %rdi,%rbx mov $0x8,%edi callq 0x4008e0 <_Znwm@plt> movq $0x400c78,(%rax) mov %rax,(%rbx) mov %rbx,%rax pop %rbx retq

Quick guide - Bind templates

template<class ErrorPolicy = class TErrorPolicy>
class simple_updater {
public:
  void update() const {
    ErrorPolicy::on("update");
  }
};

template<class Updater = class TUpdater>
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<class TErrorPolicy>.to<throw_policy>(),
    di::bind<class TUpdater>.to<simple_updater>()
  );

  injector.create<example>().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<class T>
 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<exchange>(),
    di::bind<Streamable(class EngineStream)>.to<engine>()
  );

  injector.create<example>();
}

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

[](GENERATE_TOC_BEGIN)

[](GENERATE_TOC_END)


Disclaimer [Boost::ext].DI is not an official Boost library.


*Note that all licence references and agreements mentioned in the Experimental Boost.DI README section above are relevant to that project's source code only.