Injected Utility Class

Library provides also Injected utility class. This base class has inject() method that can be used to inject services in simple inline way, also there are InjectedSingleton, InjectedScoped and InjectedTransient base classes that are inheriting from Injected and Registered classes to combine these two features. Injected class has also method getProvider(), raw provider can be used to get keyed services for example.

Note

Class should inherit Injected constructor with ‘using Injected::Injected;’ in public section

Examples/Guides/InjectedUtilityClass
#include <SevenBit/DI.hpp>
#include <iostream>

using namespace sb::di;

struct ServiceA : RegisterScoped<ServiceA>
{
    std::string actionA() { return "actionA"; }
};

struct ServiceB : RegisterTransient<ServiceB>
{
    std::string actionB() { return "actionB"; }
};

struct IServiceExecutor
{
    [[nodiscard]] virtual std::string execute() const = 0;

    virtual ~IServiceExecutor() = default;
};

class ServiceExecutor final : public InjectedScoped<IServiceExecutor, ServiceExecutor>
{
    ServiceA &_serviceA = inject();
    ServiceA *_optionalServiceA = inject();
    std::vector<ServiceA *> _allServiceA = inject();

    std::unique_ptr<ServiceB> _serviceB = inject();
    ServiceB _inPlaceServiceB = inject();
    std::vector<std::unique_ptr<ServiceB>> _allServiceB = inject();

  public:
    using InjectedScoped::InjectedScoped;

    [[nodiscard]] std::string execute() const override
    {
        ServiceProvider &provider = getProvider(); // access also provider
        return _serviceA.actionA() + ", " + _serviceB->actionB() + " executed.";
    }
};

int main()
{
    ServiceProvider provider = GlobalServices::instance().buildServiceProvider();

    const auto &executor = provider.getService<IServiceExecutor>();

    std::cout << executor.execute();
    return 0;
}
Output
actionA, actionB executed.