PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
service_registration.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
27#pragma once
28
29#include "service_interfaces.h"
30
33
34#include <kcenon/common/di/service_container.h>
35
36#include <filesystem>
37#include <memory>
38
39namespace kcenon::pacs::di {
40
41// =============================================================================
42// Service Registration Configuration
43// =============================================================================
44
52 std::filesystem::path storage_path;
53
55 bool enable_network = true;
56
58 bool enable_codecs = true;
59
61 bool enable_logger = true;
62
64 bool use_singletons = true;
65
67};
68
69// =============================================================================
70// Service Registration Functions
71// =============================================================================
72
94[[nodiscard]] inline kcenon::common::VoidResult register_services(
95 kcenon::common::di::IServiceContainer& container,
96 const registration_config& config = {}) {
97
98 using namespace kcenon::common::di;
99
100 const auto lifetime = config.use_singletons
101 ? service_lifetime::singleton
102 : service_lifetime::transient;
103
104 // -------------------------------------------------------------------------
105 // Register IDicomStorage
106 // -------------------------------------------------------------------------
107 {
108 auto storage_path = config.storage_path;
109 if (storage_path.empty()) {
110 storage_path = std::filesystem::temp_directory_path() / "pacs_storage";
111 }
112
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);
119 },
120 lifetime
121 );
122
123 if (result.is_err()) {
124 return result;
125 }
126 }
127
128 // -------------------------------------------------------------------------
129 // Register IDicomNetwork
130 // -------------------------------------------------------------------------
131 if (config.enable_network) {
132 auto result = container.register_factory<IDicomNetwork>(
133 [](IServiceContainer&) -> std::shared_ptr<IDicomNetwork> {
134 return std::make_shared<DicomNetworkService>();
135 },
136 lifetime
137 );
138
139 if (result.is_err()) {
140 return result;
141 }
142 }
143
144 // -------------------------------------------------------------------------
145 // Register ILogger
146 // -------------------------------------------------------------------------
147 if (config.enable_logger) {
148 auto result = container.register_factory<ILogger>(
149 [](IServiceContainer&) -> std::shared_ptr<ILogger> {
150 return std::make_shared<LoggerService>();
151 },
152 lifetime
153 );
154
155 if (result.is_err()) {
156 return result;
157 }
158 }
159
160 return kcenon::common::VoidResult::ok({});
161}
162
172template<typename TStorage>
173 requires std::derived_from<TStorage, IDicomStorage>
174[[nodiscard]] inline kcenon::common::VoidResult register_storage(
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) {
178
179 return container.register_factory<IDicomStorage>(
180 [f = std::move(factory)](kcenon::common::di::IServiceContainer& c) -> std::shared_ptr<IDicomStorage> {
181 return f(c);
182 },
183 lifetime
184 );
185}
186
194[[nodiscard]] inline kcenon::common::VoidResult register_storage_instance(
195 kcenon::common::di::IServiceContainer& container,
196 std::shared_ptr<IDicomStorage> instance) {
197
198 return container.register_instance<IDicomStorage>(std::move(instance));
199}
200
210template<typename TNetwork>
211 requires std::derived_from<TNetwork, IDicomNetwork>
212[[nodiscard]] inline kcenon::common::VoidResult register_network(
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) {
216
217 return container.register_factory<IDicomNetwork>(
218 [f = std::move(factory)](kcenon::common::di::IServiceContainer& c) -> std::shared_ptr<IDicomNetwork> {
219 return f(c);
220 },
221 lifetime
222 );
223}
224
232[[nodiscard]] inline kcenon::common::VoidResult register_network_instance(
233 kcenon::common::di::IServiceContainer& container,
234 std::shared_ptr<IDicomNetwork> instance) {
235
236 return container.register_instance<IDicomNetwork>(std::move(instance));
237}
238
248template<typename TLogger>
249 requires std::derived_from<TLogger, ILogger>
250[[nodiscard]] inline kcenon::common::VoidResult register_logger(
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) {
254
255 return container.register_factory<ILogger>(
256 [f = std::move(factory)](kcenon::common::di::IServiceContainer& c) -> std::shared_ptr<ILogger> {
257 return f(c);
258 },
259 lifetime
260 );
261}
262
270[[nodiscard]] inline kcenon::common::VoidResult register_logger_instance(
271 kcenon::common::di::IServiceContainer& container,
272 std::shared_ptr<ILogger> instance) {
273
274 return container.register_instance<ILogger>(std::move(instance));
275}
276
277// =============================================================================
278// Convenience Functions
279// =============================================================================
280
296[[nodiscard]] inline std::shared_ptr<kcenon::common::di::service_container>
298 auto container = std::make_shared<kcenon::common::di::service_container>();
299 auto result = register_services(*container, config);
300 if (result.is_err()) {
301 return nullptr;
302 }
303 return container;
304}
305
306} // namespace kcenon::pacs::di
Network service interface for DICOM communication.
Abstract logger interface for dependency injection.
Definition ilogger.h:45
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)
bool enable_codecs
Enable codec services (default: true)
bool enable_logger
Enable logger services (default: true)