MIT License

项目介绍

gracicot/kangaru 是一个托管在 GitHub 上的开源项目,主要使用 C++ 编写,采用 MIT License 许可证,目前获得 555 个 Star、41 次 Fork。

仓库全名
gracicot/kangaru
开源许可证
MIT License
Star 数
555
Fork 数
41
未关闭 Issue
9

README 摘要

kangaru 🦘 Kangaru is an inversion of control container for C++11, C++14 and later. It provides many features to automate dependency injection and reduce the amount of wiring boilerplate in your code. We are achieving that by exposing in code configuration for autowiring, constructor and function parameters injection. We aim to keep the simplest interface possible and keep boilerplate to a minimum. On top of that,…

完整内容见 GitHub 原始 README 或本页 。

常见问题

kangaru 用什么语言开发?

主要使用 C++ 编写,采用 MIT License 许可证,目前有 555 个 Star。

kangaru 可以免费商用吗?

仓库采用 MIT License 许可证,可免费使用与修改,商业使用请遵守许可证条款(例如保留版权声明与许可声明)。

如何获取 kangaru 的源码?

可以直接克隆仓库:git clone https://github.com/gracicot/kangaru.git,默认分支为 master;安装与运行步骤见仓库 README。

kangaru 最近还在维护吗?

仓库最近一次更新为 3 天前,当前有 9 个未关闭 Issue;Star 数为 555,可作为社区活跃度的参考。

关于

🦘 A dependency injection container for C++11, C++14 and later

描述取自 GitHub 官方 API,中文内容由 GitRead 中文社区 编辑团队整理。

简要分析

热度分
660
价值分
347
活跃状态
活跃

语言占比

C++
CMake

Release

README

kangaru 🦘

Build status All OS Codacy Badge CII Best Practices Join the chat at https://gitter.im/gracicot/kangaru GitHub license GitHub Releases GitHub Issues Try online

Kangaru is an inversion of control container for C++11, C++14 and later. It provides many features to automate dependency injection and reduce the amount of wiring boilerplate in your code. We are achieving that by exposing in code configuration for autowiring, constructor and function parameters injection. We aim to keep the simplest interface possible and keep boilerplate to a minimum. On top of that, we don’t want to be intrusive into user/library code.

Kangaru is a header only library because of its extensive use of templates. The name kangaru comes from the container’s feature to inject itself into a service as a dependency, and because kangaroos are awesome.


Documentation and tutorial is in the wiki and the doc folder!

Looking for the latest stable version? Check out our release page.

Overview

Here’s a quick demo to show usage of this library. This is some basic usage of the library with two user classes.

#include <kangaru/kangaru.hpp>
#include <cassert>

// We define some normal classes with dependencies between them
struct Camera {};

struct Scene {
    Camera& camera;
};

// The following is the configuration of our user classes above.
// The structure and dependency graph is defined by these configs.

// Camera is a single service so the service has a shared instance.
// It will be injected and returned as a reference.
struct CameraService : kgr::single_service<Camera> {};

// Scene is not single, so the container returns scenes by value.
// Also, we depend on a camera to be constructed.
struct SceneService : kgr::service<Scene, kgr::dependency<CameraService>> {};

int main()
{
    kgr::container container;
    
    // The service function returns instances of the normal classes.
    Scene scene = container.service<SceneService>();
    Camera& camera = container.service<CameraService>();
    
    assert(&scene.camera == &camera); // passes, both cameras are the same instance.
}

Try this example online to see how it runs.

Autowire API

Since recent versions of kangaru, we support autowire api. The following is the same example as above, using autowire.

#include <kangaru/kangaru.hpp>
#include <cassert>

// We define some normal classes with dependencies between them
// And we added the autowire configuration
struct Camera {
    // friend functions are faster to lookup than plain free functions
    friend auto service_map(Camera const&) -> kgr::autowire_single;
};

struct Scene {
    Camera& camera;
    
    friend auto service_map(Scene const&) -> kgr::autowire;
};

// No need for service definitions

int main()
{
    kgr::container container;
    
    // We invoke a lambda that receives injected parameters.
    // The container will figure how to wire the classes using
    // either the constructor parameters or aggregate initialization
    container.invoke([](Scene scene, Camera& camera) {
        assert(&scene.camera == &camera); // passes, both cameras are the same instance.
    });
}

Features

  • Non intrusive, no existing classes need modification
  • You tell the container how to construct your types, store and inject them
  • Injection by setters
  • Autowiring by class constructors
  • Function parameter injection
  • Clean and simple API for simple cases, flexible enough for complex cases
  • Low runtime overhead
  • Header only library
  • Clean diagnostics at compile-time

Installation

Build kangaru yourself

To make kangaru available on your machine, you must first clone the repository:

$ git clone https://github.com/gracicot/kangaru.git && cd kangaru

Then use cmake to generate the project and export the package information:

$ cmake --preset export # -DKANGARU_HASH_TYPE_ID=OFF # uncomment for older compiler support

That’s it! Link it to your project using cmake and you can already include and code!

Optionally, you can also install kangaru on your system:

$ sudo cmake --build --preset export --target install # optional step

Install with vcpkg

To make kangaru available on your machine, install vcpkg. Then install the appropriate architecture. For the default, enter the following:

vcpkg install kangaru

or if you want 64-bit Windows, for example, enter:

vcpkg install kangaru:x64-windows

Adding Include Path

You must use the find_package function:

find_package(kangaru 4.3 REQUIRED)

And then add the include dirs to your target:

target_link_libraries(<YOUR TARGET> PUBLIC kangaru::kangaru)

Then you can include the library as follows:

#include <kangaru/kangaru.hpp>

If you skip the installation, simply tell CMake where to find kangaru:

# in your project build directory
$ cmake .. -DCMAKE_PREFIX_PATH=../../path/to/kangaru/build

Compiler Requirement

Kangaru is tested by our continuous integration with all major compiler versions. The minimum required versions are:

  • MSVC: 2015 update 3 or better
  • GCC: 4.8.5 or better
  • Clang: 3.6 or better
  • AppleClang: 7.0 or better

What’s Next

There is some feature I would like to see become real. Here’s a list of those, feel free to contribute!

  • Tests for compile-time errors
  • Better messages for compile-time errors (ongoing)
  • Service sources, more detail here: #41
  • Even better performance (ongoing)
  • Expose a zero-overhead interface for cases it can apply
  • Move service definitions to service map.

Got suggestions or questions? Discovered a bug? Please open an issue and we’ll gladly respond!

Contributing

To contribute, simply open a pull request or an issue and we’ll discuss together about how to make this library even more awesome! See our complete contribution guideline for more details.

Want to help? Pick an issue on our issue tracker!

Found an issue? Have an idea to make this library better? Please submit an issue and we will respond within a few days, and commit to address the needs.

Running Tests

Tests are enabled using the cmake profile dev. Enabling this will make our CMake scripts to try finding the Catch2 library. We also contain a submodule for this library in our git repository in case you don’t have it available in a prefix directory. You can also enable vcpkg to download the dependencies.

Using this option adds the the test target.

You can run the tests like this:

cmake --preset dev
cmake --build --preset debug
ctest --preset debug

Who’s Using Kangaru

Here’s a list of projects making use of kangaru:

  • Our team’s game engine
  • The people I helped integrating this library into their projects
  • Surely more!

Using kangaru?

Let me know of your projects using kangaru! I’ll be glad to fill the list above with your project’s name.

Acknowledgements

A big thanks to Louis-Alexandre Vallières-Lavoie for reviewing and proposing various improvements to our documentation.

评论

暂无评论