solinject
1.0.0
C++17 Dependency Injection header-only library
|
Go to the documentation of this file.
42 namespace sol::di::impl
76 m_RegisteredServices(
std::move(services))
82 m_RegisteredServices(other.m_RegisteredServices)
111 swap(a.m_RegisteredServices, b.m_RegisteredServices);
121 for (
auto& pair : other.m_RegisteredServices)
123 auto& source = pair.second;
124 auto& destination = m_RegisteredServices[pair.first];
126 impl::ConcatenateVectors(destination,
std::move(source));
138 RegisterServiceInternal<T, SingletonService<T>>(factory);
149 RegisterServiceInternal<T, SingletonService<T>>(instance);
160 RegisterServiceInternal<T, TransientService<T>>(factory);
171 RegisterServiceInternal<T, SharedService<T>>(factory);
183 RegisterServiceInternal(type, diService);
196 return GetServiceInternal<T, false>(container);
209 return GetServiceInternal<T, true>(container);
222 using namespace std::string_literals;
224 auto serviceIt = m_RegisteredServices.find(
std::type_index(
typeid(T)));
226 if (serviceIt == m_RegisteredServices.end())
229 auto& services = serviceIt->second;
238 [
this, &container](
auto& diService)
240 return GetServiceInstance<T>(diService, container);
257 m_RegisteredServices[type].push_back(diService);
266 template <
class TService,
class TDIService>
267 void RegisterServiceInternal(Factory<TService> factory)
269 RegisterServiceInternal(
271 std::make_shared<TDIService>(factory)
281 template <
class TService,
class TDIService>
282 void RegisterServiceInternal(ServicePtr<TService> instance)
286 m_RegisteredServices[
std::type_index(
typeid(TService))].push_back(std::make_shared<TDIService>(instance));
297 ServicePtr<T> GetServiceInstance(
const DIServicePtr& diServicePtr,
const Container& container)
const
301 auto castedDiServicePtr = std::dynamic_pointer_cast<IServiceTyped<T>>(diServicePtr);
305 return castedDiServicePtr->GetService(container);
316 template <
class T,
bool nothrow>
317 ServicePtr<T> GetServiceInternal(
const Container& container)
const
319 using namespace std::string_literals;
321 auto serviceIt = m_RegisteredServices.find(
std::type_index(
typeid(T)));
324 serviceIt != m_RegisteredServices.end() &&
325 !serviceIt->second.empty();
327 if constexpr (!nothrow)
331 if constexpr (nothrow)
334 throw exc::ServiceNotRegisteredException(
typeid(T));
336 auto& services = serviceIt->second;
338 return GetServiceInstance<T>(*services.rbegin(), container);
std::map< std::type_index, std::vector< DIServicePtr > > RegisteredServicesMap
Map of registered DI services.
Definition: RegisteredServices.hpp:66
#define solinject_assert(expression)
assert() macro, which is disabled in tests project.
Definition: Defines.hpp:34
void Merge(RegisteredServices other)
Merges other RegisteredServices instance into this instance.
Definition: RegisteredServices.hpp:119
Dependency Injection container.
Definition: Container.hpp:48
RegisteredServices(RegisteredServicesMap services)
Constructor.
Definition: RegisteredServices.hpp:75
void RegisterSingletonService(ServicePtr< T > instance)
Registers a service with singleton lifetime.
Definition: RegisteredServices.hpp:147
T back_inserter(T... args)
std::vector< ServicePtr< T > > GetServices(const Container &container) const
Resolves services.
Definition: RegisteredServices.hpp:220
Registered DI services collection.
Definition: RegisteredServices.hpp:45
#define solinject_req_assert(expression)
Required assert, which is disabled only when the assert() macro from assert.h is disabled.
Definition: Defines.hpp:41
RegisteredServices(const RegisteredServices &other)
Copy constructor.
Definition: RegisteredServices.hpp:81
void RegisterSharedService(Factory< T > factory)
Registers a service with shared lifetime.
Definition: RegisteredServices.hpp:169
ServicePtr< T > GetRequiredService(const Container &container) const
Resolves a required service.
Definition: RegisteredServices.hpp:194
RegisteredServices()
Default constructor.
Definition: RegisteredServices.hpp:69
ServicePtr< T > GetService(const Container &container) const
Resolves an optional service.
Definition: RegisteredServices.hpp:207
RegisteredServices & operator=(RegisteredServices &&other)
Move-assignment operator.
Definition: RegisteredServices.hpp:100
RegisteredServices(RegisteredServices &&other)
Move constructor.
Definition: RegisteredServices.hpp:87
typename IServiceTyped< T >::ServicePtr ServicePtr
Pointer to an instance of a service.
Definition: RegisteredServices.hpp:60
typename std::shared_ptr< T > ServicePtr
Pointer to an instance of a service.
Definition: IServiceTyped.hpp:36
void RegisterTransientService(Factory< T > factory)
Registers a service with transient lifetime.
Definition: RegisteredServices.hpp:158
typename IServiceTyped< T >::Factory Factory
Factory function that accepts a reference to a DI container and returns a pointer to an instance of a...
Definition: RegisteredServices.hpp:53
void RegisterSingletonService(Factory< T > factory)
Registers a service with singleton lifetime.
Definition: RegisteredServices.hpp:136
friend void swap(RegisteredServices &a, RegisteredServices &b)
Swaps two RegisteredServices instances.
Definition: RegisteredServices.hpp:107
std::shared_ptr< IService > DIServicePtr
Pointer to a DI service instance.
Definition: RegisteredServices.hpp:63
RegisteredServices & operator=(RegisteredServices other)
Copy-assignment operator.
Definition: RegisteredServices.hpp:93
typename std::function< ServicePtr(const Container &)> Factory
Factory function that accepts a reference to a DI container and returns a pointer to an instance of a...
Definition: IServiceTyped.hpp:42
void RegisterService(std::type_index type, DIServicePtr diService)
Registers a service.
Definition: RegisteredServices.hpp:181