Skip to content

Commit ee2fb54

Browse files
committed
update thread safe concept implementation and update docs
1 parent 7caec7d commit ee2fb54

File tree

4 files changed

+51
-41
lines changed

4 files changed

+51
-41
lines changed

Include/SevenBit/DI/IServiceInstanceProvider.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ namespace sb::di
3030
*/
3131
[[nodiscard]] virtual Ptr createScope() const = 0;
3232

33+
/**
34+
* @brief Get sync mutex
35+
* @details Mutex can be used to synchronize service accesses between threads, can be null if synchronization is
36+
* not needed
37+
*/
3338
virtual std::recursive_mutex *tryGetSyncMutex() = 0;
3439

3540
/**

Include/SevenBit/DI/ServiceCollection.hpp

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -476,8 +476,8 @@ namespace sb::di
476476
*
477477
* Example:
478478
* @code{.cpp}
479-
* ServiceCollection{}.add<TestClass>(ServiceLifeTimes::Scoped, "key");
480-
* ServiceCollection{}.add<BaseClass, ImplementationClass>(ServiceLifeTimes::Transient, "key");
479+
* ServiceCollection{}.addKeyed<TestClass>(ServiceLifeTimes::Scoped, "key");
480+
* ServiceCollection{}.addKeyed<BaseClass, ImplementationClass>(ServiceLifeTimes::Transient, "key");
481481
* @endcode
482482
*/
483483
template <class TService, class TImplementation = TService>
@@ -515,8 +515,8 @@ namespace sb::di
515515
*
516516
* Example:
517517
* @code{.cpp}
518-
* ServiceCollection{}.addSingleton<TestClass>("key");
519-
* ServiceCollection{}.addSingleton<BaseClass, ImplementationClass>("key");
518+
* ServiceCollection{}.addKeyedSingleton<TestClass>("key");
519+
* ServiceCollection{}.addKeyedSingleton<BaseClass, ImplementationClass>("key");
520520
* @endcode
521521
*/
522522
template <class TService, class TImplementation = TService>
@@ -554,8 +554,8 @@ namespace sb::di
554554
*
555555
* Example:
556556
* @code{.cpp}
557-
* ServiceCollection{}.addScoped<TestClass>("key");
558-
* ServiceCollection{}.addScoped<BaseClass, ImplementationClass>("key");
557+
* ServiceCollection{}.addKeyedScoped<TestClass>("key");
558+
* ServiceCollection{}.addKeyedScoped<BaseClass, ImplementationClass>("key");
559559
* @endcode
560560
*/
561561
template <class TService, class TImplementation = TService>
@@ -593,8 +593,8 @@ namespace sb::di
593593
*
594594
* Example:
595595
* @code{.cpp}
596-
* ServiceCollection{}.addTransient<TestClass>("key");
597-
* ServiceCollection{}.addTransient<BaseClass, ImplementationClass>("key");
596+
* ServiceCollection{}.addKeyedTransient<TestClass>("key");
597+
* ServiceCollection{}.addKeyedTransient<BaseClass, ImplementationClass>("key");
598598
* @endcode
599599
*/
600600
template <class TService, class TImplementation = TService>
@@ -629,7 +629,7 @@ namespace sb::di
629629
* Example:
630630
* @code{.cpp}
631631
* TestClass test;
632-
* ServiceCollection{}.addSingleton("key", &test);
632+
* ServiceCollection{}.addKeyedSingleton("key", &test);
633633
* @endcode
634634
*/
635635
template <class TService> ServiceCollection &addKeyedSingleton(std::string serviceKey, TService *service)
@@ -667,7 +667,7 @@ namespace sb::di
667667
* Example:
668668
* @code{.cpp}
669669
* ImplementationClass implementation;
670-
* ServiceCollection{}.addSingleton<BaseClass>("key", &implementation);
670+
* ServiceCollection{}.addKeyedSingleton<BaseClass>("key", &implementation);
671671
* @endcode
672672
*/
673673
template <class TService, class TImplementation>
@@ -710,7 +710,7 @@ namespace sb::di
710710
*
711711
* Example:
712712
* @code{.cpp}
713-
* ServiceCollection{}.add<BaseClass>(ServiceLifeTimes::Scoped, "key",
713+
* ServiceCollection{}.addKeyed<BaseClass>(ServiceLifeTimes::Scoped, "key",
714714
* []() { return std::make_unique<ImplementationClass>(); });
715715
* @endcode
716716
*/
@@ -750,7 +750,8 @@ namespace sb::di
750750
*
751751
* Example:
752752
* @code{.cpp}
753-
* ServiceCollection{}.addSingleton<BaseClass>("key", []() { return std::make_unique<ImplementationClass>(); });
753+
* ServiceCollection{}.addKeyedSingleton<BaseClass>("key", []() { return
754+
* std::make_unique<ImplementationClass>(); });
754755
* @endcode
755756
*/
756757
template <class TService, class FactoryFcn>
@@ -789,7 +790,8 @@ namespace sb::di
789790
*
790791
* Example:
791792
* @code{.cpp}
792-
* ServiceCollection{}.addScoped<BaseClass>("key", []() { return std::make_unique<ImplementationClass>(); });
793+
* ServiceCollection{}.addKeyedScoped<BaseClass>("key", []() { return std::make_unique<ImplementationClass>();
794+
* });
793795
* @endcode
794796
*/
795797
template <class TService, class FactoryFcn>
@@ -828,7 +830,8 @@ namespace sb::di
828830
*
829831
* Example:
830832
* @code{.cpp}
831-
* ServiceCollection{}.addTransient<BaseClass>("key", []() { return std::make_unique<ImplementationClass>(); });
833+
* ServiceCollection{}.addKeyedTransient<BaseClass>("key", []() { return
834+
* std::make_unique<ImplementationClass>(); });
832835
* @endcode
833836
*/
834837
template <class TService, class FactoryFcn>
@@ -867,7 +870,8 @@ namespace sb::di
867870
*
868871
* Example:
869872
* @code{.cpp}
870-
* ServiceCollection{}.add(ServiceLifeTimes::Transient, "key", []() { return std::make_unique<TestClass>(); });
873+
* ServiceCollection{}.addKeyed(ServiceLifeTimes::Transient, "key", []() { return std::make_unique<TestClass>();
874+
* });
871875
* @endcode
872876
*/
873877
template <class FactoryFcn>
@@ -904,7 +908,7 @@ namespace sb::di
904908
*
905909
* Example:
906910
* @code{.cpp}
907-
* ServiceCollection{}.addSingleton("key", []() { return std::make_unique<TestClass>(); });
911+
* ServiceCollection{}.addKeyedSingleton("key", []() { return std::make_unique<TestClass>(); });
908912
* @endcode
909913
*/
910914
template <class FactoryFcn> ServiceCollection &addKeyedSingleton(std::string serviceKey, FactoryFcn factory)
@@ -940,7 +944,7 @@ namespace sb::di
940944
*
941945
* Example:
942946
* @code{.cpp}
943-
* ServiceCollection{}.addScoped("key", []() { return std::make_unique<TestClass>(); });
947+
* ServiceCollection{}.addKeyedScoped("key", []() { return std::make_unique<TestClass>(); });
944948
* @endcode
945949
*/
946950
template <class FactoryFcn> ServiceCollection &addKeyedScoped(std::string serviceKey, FactoryFcn factory)
@@ -976,7 +980,7 @@ namespace sb::di
976980
*
977981
* Example:
978982
* @code{.cpp}
979-
* ServiceCollection{}.addTransient("key", []() { return std::make_unique<TestClass>(); });
983+
* ServiceCollection{}.addKeyedTransient("key", []() { return std::make_unique<TestClass>(); });
980984
* @endcode
981985
*/
982986
template <class FactoryFcn> ServiceCollection &addKeyedTransient(std::string serviceKey, FactoryFcn factory)
@@ -1026,7 +1030,7 @@ namespace sb::di
10261030
*
10271031
* Example:
10281032
* @code{.cpp}
1029-
* ServiceCollection{}.addAlias<AliasClass, ServiceClass>("aliasKey", "key");
1033+
* ServiceCollection{}.addKeyedAlias<AliasClass, ServiceClass>("aliasKey", "key");
10301034
* @endcode
10311035
*/
10321036
template <class TAlias, class TService>
@@ -1045,7 +1049,7 @@ namespace sb::di
10451049
*
10461050
* Example:
10471051
* @code{.cpp}
1048-
* ServiceCollection{}.addAlias<AliasClass, ServiceClass>("aliasKey");
1052+
* ServiceCollection{}.addKeyedAlias<AliasClass, ServiceClass>("aliasKey");
10491053
* @endcode
10501054
*/
10511055
template <class TAlias, class TService> ServiceCollection &addKeyedAlias(std::string serviceAliasKey)

Include/SevenBit/DI/ServiceProvider.hpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ namespace sb::di
113113
*
114114
* Example:
115115
* @code{.cpp}
116-
* auto provider = ServiceCollection{}.addScoped<TestClass>().buildServiceProvider();
116+
* auto provider = ServiceCollection{}.addKeyedScoped<TestClass>("key").buildServiceProvider();
117117
*
118-
* TestClass* service = provider.tryGetService<TestClass>();
118+
* TestClass* service = provider.tryGetKeyedService<TestClass>("key");
119119
* @endcode
120120
*/
121121
template <class TService> TService *tryGetKeyedService(const std::string_view serviceKey)
@@ -157,9 +157,9 @@ namespace sb::di
157157
*
158158
* Example:
159159
* @code{.cpp}
160-
* auto provider = ServiceCollection{}.addScoped<TestClass>().buildServiceProvider();
160+
* auto provider = ServiceCollection{}.addKeyedScoped<TestClass>("key").buildServiceProvider();
161161
*
162-
* TestClass& service = provider.getService<TestClass>();
162+
* TestClass& service = provider.getKeyedService<TestClass>("key");
163163
* @endcode
164164
*/
165165
template <class TService> TService &getKeyedService(const std::string_view serviceKey)
@@ -205,11 +205,11 @@ namespace sb::di
205205
* Example:
206206
* @code{.cpp}
207207
* auto provider = ServiceCollection{}
208-
* .addScoped<ITestClass, TestClass1>()
209-
* .addScoped<ITestClass, TestClass2>()
208+
* .addKeyedScoped<ITestClass, TestClass1>("key")
209+
* .addKeyedScoped<ITestClass, TestClass2>("key")
210210
* .buildServiceProvider();
211211
*
212-
* std::vector<ITestClass *> services = provider.getServices<ITestClass>();
212+
* std::vector<ITestClass *> services = provider.getKeyedServices<ITestClass>("key");
213213
* @endcode
214214
*/
215215
template <class TService> std::vector<TService *> getKeyedServices(const std::string_view serviceKey)
@@ -253,9 +253,9 @@ namespace sb::di
253253
*
254254
* Example:
255255
* @code{.cpp}
256-
* auto provider = ServiceCollection{}.addTransient<TestClass>().buildServiceProvider();
256+
* auto provider = ServiceCollection{}.addKeyedTransient<TestClass>("key").buildServiceProvider();
257257
*
258-
* std::unique_ptr<TestClass> service = provider.tryCreateService<TestClass>();
258+
* std::unique_ptr<TestClass> service = provider.tryCreateKeyedService<TestClass>("key");
259259
* @endcode
260260
*/
261261
template <class TService> std::unique_ptr<TService> tryCreateKeyedService(const std::string_view serviceKey)
@@ -296,9 +296,9 @@ namespace sb::di
296296
*
297297
* Example:
298298
* @code{.cpp}
299-
* auto provider = ServiceCollection{}.addTransient<TestClass>().buildServiceProvider();
299+
* auto provider = ServiceCollection{}.addKeyedTransient<TestClass>("key").buildServiceProvider();
300300
*
301-
* std::unique_ptr<TestClass> service = provider.createService<TestClass>();
301+
* std::unique_ptr<TestClass> service = provider.createKeyedService<TestClass>("key");
302302
* @endcode
303303
*/
304304
template <class TService> std::unique_ptr<TService> createKeyedService(const std::string_view serviceKey)
@@ -344,9 +344,9 @@ namespace sb::di
344344
*
345345
* Example:
346346
* @code{.cpp}
347-
* auto provider = ServiceCollection{}.addTransient<TestClass>().buildServiceProvider();
347+
* auto provider = ServiceCollection{}.addKeyedTransient<TestClass>("key").buildServiceProvider();
348348
*
349-
* TestClass service = provider.createServiceInPlace<TestClass>();
349+
* TestClass service = provider.createKeyedServiceInPlace<TestClass>("key");
350350
* @endcode
351351
*/
352352
template <class TService> TService createKeyedServiceInPlace(const std::string_view serviceKey)
@@ -396,11 +396,11 @@ namespace sb::di
396396
* Example:
397397
* @code{.cpp}
398398
* auto provider = ServiceCollection{}
399-
* .addTransient<ITestClass, TestClass1>()
400-
* .addTransient<ITestClass, TestClass2>()
399+
* .addKeyedTransient<ITestClass, TestClass1>("key")
400+
* .addKeyedTransient<ITestClass, TestClass2>("key")
401401
* .buildServiceProvider();
402402
*
403-
* std::vector<std::unique_ptr<ITestClass>> services = provider.createServices<ITestClass>();
403+
* std::vector<std::unique_ptr<ITestClass>> services = provider.createKeyedServices<ITestClass>("key");
404404
* @endcode
405405
*/
406406
template <class TService>
@@ -417,11 +417,8 @@ namespace sb::di
417417
private:
418418
std::optional<std::unique_lock<std::recursive_mutex>> tryUniqueLock()
419419
{
420-
if (const auto mutex = getInstanceProvider().tryGetSyncMutex())
421-
{
422-
return std::unique_lock{*mutex};
423-
}
424-
return std::nullopt;
420+
const auto mutexPtr = getInstanceProvider().tryGetSyncMutex();
421+
return mutexPtr ? std::make_optional(std::unique_lock{*mutexPtr}) : std::nullopt;
425422
}
426423
};
427424
} // namespace sb::di

Include/SevenBit/DI/ServiceProviderOptions.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ namespace sb::di
3434
*/
3535
bool searchInSigletonsFirst = true;
3636

37+
/**
38+
* @brief Enables thread safe mode
39+
* @details Provider will synchronize service accesses between threads
40+
*/
3741
bool threadSafe = false;
3842
};
3943
} // namespace sb::di

0 commit comments

Comments
 (0)