@@ -13,43 +13,53 @@ namespace sb::di::details
1313
1414 template <class T > struct ServiceGetter
1515 {
16- static auto get (ServiceProvider &provider)
16+ static_assert (IsInPlaceServiceV<T> || notSupportedType<T>,
17+ " Type is not supported as function argument parameter use objects, pointers, references, "
18+ " std::unique_ptr<T>, std::vector containing pointers or std::unique_ptr<T>" );
19+
20+ static auto get (ServiceProvider &provider) { return provider.createServiceInPlace <T>(); }
21+ static auto get (ServiceProvider &provider, const std::string_view key)
1722 {
18- if constexpr (IsInPlaceServiceV<T>)
19- {
20- return provider.createServiceInPlace <T>();
21- }
22- else
23- {
24- static_assert (notSupportedType<T>,
25- " Type is not supported as function argument parameter use objects, pointers, references, "
26- " std::unique_ptr<T>, std::vector containing pointers or std::unique_ptr<T>" );
27- }
23+ return provider.createKeyedServiceInPlace <T>(key);
2824 }
2925 };
3026
3127 template <class T > struct ServiceGetter <T *>
3228 {
3329 static T *get (ServiceProvider &sp) { return sp.tryGetService <T>(); }
30+ static T *get (ServiceProvider &sp, const std::string_view key) { return sp.tryGetKeyedService <T>(key); }
3431 };
3532
3633 template <class T > struct ServiceGetter <T &>
3734 {
3835 static T &get (ServiceProvider &sp) { return sp.getService <T>(); }
36+ static T &get (ServiceProvider &sp, const std::string_view key) { return sp.getKeyedService <T>(key); }
3937 };
4038
4139 template <class T > struct ServiceGetter <std::vector<T *>>
4240 {
4341 static std::vector<T *> get (ServiceProvider &sp) { return sp.getServices <T>(); }
42+ static std::vector<T *> get (ServiceProvider &sp, const std::string_view key)
43+ {
44+ return sp.getKeyedServices <T>(key);
45+ }
4446 };
4547
4648 template <class T > struct ServiceGetter <std::unique_ptr<T>>
4749 {
4850 static std::unique_ptr<T> get (ServiceProvider &sp) { return sp.createService <T>(); }
51+ static std::unique_ptr<T> get (ServiceProvider &sp, const std::string_view key)
52+ {
53+ return sp.createKeyedService <T>(key);
54+ }
4955 };
5056
5157 template <class T > struct ServiceGetter <std::vector<std::unique_ptr<T>>>
5258 {
5359 static std::vector<std::unique_ptr<T>> get (ServiceProvider &sp) { return sp.createServices <T>(); }
60+ static std::vector<std::unique_ptr<T>> get (ServiceProvider &sp, const std::string_view key)
61+ {
62+ return sp.createKeyedServices <T>(key);
63+ }
5464 };
5565} // namespace sb::di::details
0 commit comments