Register Utility Class

The library provides a simple template RegisterService utility class. This base class can be used to automatically register class in service collection with the use of a specialized TRegisterer. There are already created aliases RegisterSingleton, RegisterScoped, RegisterTransient that are registering services in GlobalServices singleton.

Note

The class should inherit Injected constructor with ‘using Injected::Injected;’ in the public section

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

using namespace sb::di;

struct IServiceA
{
    virtual std::string actionA() = 0;

    virtual ~IServiceA() = default;
};

struct IServiceB
{
    virtual std::string actionB() = 0;

    virtual ~IServiceB() = default;
};

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

    virtual ~IServiceExecutor() = default;
};

struct ServiceA final : IServiceA, RegisterSingleton<IServiceA, ServiceA>
{
    std::string actionA() override { return "actionA"; }
};

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

class ServiceExecutor final : public IServiceExecutor, public RegisterScoped<IServiceExecutor, ServiceExecutor>
{
    IServiceA &_serviceA;
    std::unique_ptr<IServiceB> _serviceB;

  public:
    ServiceExecutor(IServiceA &serviceA, std::unique_ptr<IServiceB> serviceB)
        : _serviceA(serviceA), _serviceB(std::move(serviceB))
    {
    }

    [[nodiscard]] std::string execute() const override
    {
        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.