Popularity
5.2
Growing
Activity
5.5
-
646
64
68

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.1.0

Experimental Boost.DI alternatives and similar libraries

Based on the "Miscellaneous" category

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


[Boost].DI

Your C++14 one header only Dependency Injection library with no dependencies (Try it online!)

Quick start

Download

[Boost].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.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.