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.