67 template <
class TService,
class...TServiceParents>
74 services[ServiceLifetime::Singleton] =
std::make_shared<SingletonService<TService, TServiceParents...>>(factory);
75 services[ServiceLifetime::Transient] =
std::make_shared<TransientService<TService, TServiceParents...>>(factory);
76 services[ServiceLifetime::Shared] =
std::make_shared<SharedService<TService, TServiceParents...>>(factory);
78 m_RegisteredServices[key] =
std::move(services);
79 m_RegisteredScopedServiceBuilders[key] =
80 std::make_shared<ScopedServiceBuilder<TService, TServiceParents...>>(factory);
82 m_RegisteredInterfaces.try_emplace(key,
std::type_index(
typeid(TService)));
97 m_ServicesRegistration[item.InterfaceKey()].push_back(
104 for (
const auto& pair : m_ServicesRegistration)
106 auto interfaceKey = pair.first;
109 m_RegisteredInterfaces.
at(interfaceKey);
111 for (
const auto& item : pair.second)
113 auto resolvedServices = ResolveService(interfaceKey, item);
115 for (
const auto& service : resolvedServices)
117 if (std::holds_alternative<DIServicePtr>(service))
118 container.
RegisterService(interfaceType, std::get<DIServicePtr>(service));
122 std::get<ScopedServiceBuilderPtr>(service)
128 m_ServicesRegistration.clear();
141 ServiceKeyToImplementationKeyMap m_ServicesRegistration;
142 RegisteredServicesMap m_RegisteredServices;
143 RegisteredScopedServiceBuildersMap m_RegisteredScopedServiceBuilders;
144 KeyToTypeMap m_RegisteredInterfaces;
146 using ServiceOrBuilder = std::variant<DIServicePtr, ScopedServiceBuilderPtr>;
152 const auto& key = std::get<0>(item);
153 const auto& lifetime = std::get<1>(item);
155 if (interfaceKey != key)
156 if (
auto it = m_ServicesRegistration.find(key);
157 it != m_ServicesRegistration.end())
159 for (
const auto& item2 : it->second)
160 impl::ConcatenateVectors(
162 ResolveService(it->first, item2)
168 case ServiceLifetime::None:
break;
169 case ServiceLifetime::Scoped:
170 if (
auto it = m_RegisteredScopedServiceBuilders.find(key);
171 it != m_RegisteredScopedServiceBuilders.end())
173 const auto& builder = it->second;
177 if (
auto it = m_RegisteredServices.find(key);
178 it != m_RegisteredServices.end())
180 auto& services = it->second;