34#include <kcenon/common/di/service_container.h>
95 kcenon::common::di::IServiceContainer& container,
98 using namespace kcenon::common::di;
100 const auto lifetime = config.use_singletons
101 ? service_lifetime::singleton
102 : service_lifetime::transient;
108 auto storage_path = config.storage_path;
109 if (storage_path.empty()) {
110 storage_path = std::filesystem::temp_directory_path() /
"pacs_storage";
113 auto result = container.register_factory<IDicomStorage>(
114 [path = storage_path](IServiceContainer&) -> std::shared_ptr<IDicomStorage> {
115 storage::file_storage_config storage_config;
116 storage_config.root_path = path;
117 storage_config.create_directories =
true;
118 return std::make_shared<storage::file_storage>(storage_config);
123 if (result.is_err()) {
131 if (config.enable_network) {
132 auto result =
container.register_factory<IDicomNetwork>(
133 [](IServiceContainer&) -> std::shared_ptr<IDicomNetwork> {
134 return std::make_shared<DicomNetworkService>();
139 if (result.is_err()) {
147 if (config.enable_logger) {
148 auto result =
container.register_factory<ILogger>(
149 [](IServiceContainer&) -> std::shared_ptr<ILogger> {
150 return std::make_shared<LoggerService>();
155 if (result.is_err()) {
160 return kcenon::common::VoidResult::ok({});
172template<
typename TStorage>
173 requires std::derived_from<TStorage, IDicomStorage>
175 kcenon::common::di::IServiceContainer& container,
176 std::function<std::shared_ptr<TStorage>(kcenon::common::di::IServiceContainer&)> factory,
177 kcenon::common::di::service_lifetime lifetime = kcenon::common::di::service_lifetime::singleton) {
180 [f = std::move(factory)](kcenon::common::di::IServiceContainer& c) -> std::shared_ptr<IDicomStorage> {
195 kcenon::common::di::IServiceContainer& container,
196 std::shared_ptr<IDicomStorage> instance) {
198 return container.register_instance<
IDicomStorage>(std::move(instance));
210template<
typename TNetwork>
211 requires std::derived_from<TNetwork, IDicomNetwork>
213 kcenon::common::di::IServiceContainer& container,
214 std::function<std::shared_ptr<TNetwork>(kcenon::common::di::IServiceContainer&)> factory,
215 kcenon::common::di::service_lifetime lifetime = kcenon::common::di::service_lifetime::singleton) {
218 [f = std::move(factory)](kcenon::common::di::IServiceContainer& c) -> std::shared_ptr<IDicomNetwork> {
233 kcenon::common::di::IServiceContainer& container,
234 std::shared_ptr<IDicomNetwork> instance) {
236 return container.register_instance<
IDicomNetwork>(std::move(instance));
248template<
typename TLogger>
249 requires std::derived_from<TLogger, ILogger>
251 kcenon::common::di::IServiceContainer& container,
252 std::function<std::shared_ptr<TLogger>(kcenon::common::di::IServiceContainer&)> factory,
253 kcenon::common::di::service_lifetime lifetime = kcenon::common::di::service_lifetime::singleton) {
255 return container.register_factory<
ILogger>(
256 [f = std::move(factory)](kcenon::common::di::IServiceContainer& c) -> std::shared_ptr<ILogger> {
271 kcenon::common::di::IServiceContainer& container,
272 std::shared_ptr<ILogger> instance) {
274 return container.register_instance<
ILogger>(std::move(instance));
296[[nodiscard]]
inline std::shared_ptr<kcenon::common::di::service_container>
298 auto container = std::make_shared<kcenon::common::di::service_container>();
300 if (result.is_err()) {
Network service interface for DICOM communication.
Abstract logger interface for dependency injection.
Filesystem-based DICOM storage with hierarchical organization.
kcenon::common::VoidResult register_logger(kcenon::common::di::IServiceContainer &container, std::function< std::shared_ptr< TLogger >(kcenon::common::di::IServiceContainer &)> factory, kcenon::common::di::service_lifetime lifetime=kcenon::common::di::service_lifetime::singleton)
Register logger service with custom implementation.
kcenon::common::VoidResult register_network(kcenon::common::di::IServiceContainer &container, std::function< std::shared_ptr< TNetwork >(kcenon::common::di::IServiceContainer &)> factory, kcenon::common::di::service_lifetime lifetime=kcenon::common::di::service_lifetime::singleton)
Register network service with custom implementation.
kcenon::common::VoidResult register_storage(kcenon::common::di::IServiceContainer &container, std::function< std::shared_ptr< TStorage >(kcenon::common::di::IServiceContainer &)> factory, kcenon::common::di::service_lifetime lifetime=kcenon::common::di::service_lifetime::singleton)
Register storage service with custom implementation.
kcenon::common::VoidResult register_network_instance(kcenon::common::di::IServiceContainer &container, std::shared_ptr< IDicomNetwork > instance)
Register network service with pre-created instance.
std::shared_ptr< kcenon::common::di::service_container > create_container(const registration_config &config={})
kcenon::common::VoidResult register_storage_instance(kcenon::common::di::IServiceContainer &container, std::shared_ptr< IDicomStorage > instance)
Register storage service with pre-created instance.
kcenon::common::VoidResult register_services(kcenon::common::di::IServiceContainer &container, const registration_config &config={})
kcenon::common::VoidResult register_logger_instance(kcenon::common::di::IServiceContainer &container, std::shared_ptr< ILogger > instance)
Register logger service with pre-created instance.
@ container
CONTAINER - Container for other items.
Service interface aliases for dependency injection.
Configuration for service registration.
bool use_singletons
Use singleton lifetime for services (default: true)
bool enable_network
Enable network services (default: true)
std::filesystem::path storage_path
Default storage path for file_storage (empty = use temp directory)
registration_config()=default
bool enable_codecs
Enable codec services (default: true)
bool enable_logger
Enable logger services (default: true)