10#include <unordered_map>
12namespace liarsdice::
di {
24 case ServiceLifetime::Transient:
25 return os <<
"Transient";
26 case ServiceLifetime::Singleton:
27 return os <<
"Singleton";
28 case ServiceLifetime::Scoped:
29 return os <<
"Scoped";
31 return os <<
"Unknown";
58 template <
typename TInterface,
typename TImplementation>
60 static_assert(std::is_base_of_v<TInterface, TImplementation>,
61 "TImplementation must inherit from TInterface");
64 = []() -> std::shared_ptr<TInterface> {
return std::make_shared<TImplementation>(); };
66 register_factory<TInterface>(std::move(factory), lifetime);
70 template <
typename TInterface>
73 auto type_id = std::type_index(
typeid(TInterface));
77 info.factory = [factory]() -> std::shared_ptr<
void> {
78 return std::static_pointer_cast<
void>(factory());
81 services_[type_id] = std::move(info);
85 template <
typename TInterface>
void register_instance(std::shared_ptr<TInterface> instance) {
86 auto type_id = std::type_index(
typeid(TInterface));
90 info.instance = std::static_pointer_cast<
void>(instance);
92 services_[type_id] = std::move(info);
96 template <
typename T> std::shared_ptr<T>
resolve() {
97 auto type_id = std::type_index(
typeid(T));
99 auto it = services_.find(type_id);
100 if (it == services_.end()) {
101 throw ServiceContainerException(
"Service not registered: " + std::string(
typeid(T).name()));
104 auto& info = it->second;
106 switch (info.lifetime) {
107 case ServiceLifetime::Singleton:
108 if (!info.instance && info.factory) {
109 info.instance = info.factory();
111 return std::static_pointer_cast<T>(info.instance);
113 case ServiceLifetime::Transient:
115 throw ServiceContainerException(
"No factory for transient service: "
116 + std::string(
typeid(T).name()));
118 return std::static_pointer_cast<T>(info.factory());
120 case ServiceLifetime::Scoped:
122 if (!info.instance && info.factory) {
123 info.instance = info.factory();
125 return std::static_pointer_cast<T>(info.instance);
128 throw ServiceContainerException(
"Failed to resolve service: "
129 + std::string(
typeid(T).name()));
134 auto type_id = std::type_index(
typeid(T));
135 return services_.find(type_id) != services_.end();
158#define REGISTER_SERVICE(container, interface, implementation)
159 container.register_service<interface, implementation>()
161#define REGISTER_SINGLETON(container, interface, implementation)
162 container.register_service<interface, implementation>(ServiceLifetime::Singleton)
164#define RESOLVE_SERVICE(container, type) container.resolve<type>()
Definition service_container.hpp:36
ServiceContainerException(const std::string &message)
Definition service_container.hpp:38
Definition service_container.hpp:46
void register_factory(ServiceFactory< TInterface > factory, ServiceLifetime lifetime=ServiceLifetime::Transient)
Definition service_container.hpp:71
std::unordered_map< std::type_index, ServiceInfo > services_
Definition service_container.hpp:151
ServiceContainer(ServiceContainer &&)=delete
size_t service_count() const
Definition service_container.hpp:142
void clear()
Definition service_container.hpp:139
ServiceContainer(const ServiceContainer &)=delete
ServiceContainer & operator=(ServiceContainer &&)=delete
void register_instance(std::shared_ptr< TInterface > instance)
Definition service_container.hpp:85
ServiceContainer()=default
ServiceContainer & operator=(const ServiceContainer &)=delete
std::shared_ptr< T > resolve()
Definition service_container.hpp:96
bool is_registered() const
Definition service_container.hpp:133
~ServiceContainer()=default
void register_service(ServiceLifetime lifetime=ServiceLifetime::Transient)
Definition service_container.hpp:59
Dependency injection framework.
Definition service_container.cpp:3
ServiceLifetime
Definition service_container.hpp:15
ServiceContainer & get_service_container()
Definition service_container.cpp:5
std::ostream & operator<<(std::ostream &os, ServiceLifetime lifetime)
Definition service_container.hpp:22
Definition service_container.hpp:145
std::function< std::shared_ptr< void >()> factory
Definition service_container.hpp:147
ServiceLifetime lifetime
Definition service_container.hpp:146
std::shared_ptr< void > instance
Definition service_container.hpp:148