Common System 0.2.0
Common interfaces and patterns for system integration
Loading...
Searching...
No Matches
service_container_example.cpp
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
14
17
18#include <iostream>
19#include <memory>
20#include <string>
21
22using namespace kcenon::common;
23using namespace kcenon::common::di;
24
25// --- Interfaces ---
26
28{
29public:
30 virtual ~IGreeter() = default;
31 virtual std::string greet(const std::string& name) const = 0;
32};
33
35{
36public:
37 virtual ~ICounter() = default;
38 virtual int next() = 0;
39};
40
41// --- Implementations ---
42
44{
45public:
46 std::string greet(const std::string& name) const override
47 {
48 return "Hello, " + name + "! Welcome aboard.";
49 }
50};
51
53{
54public:
55 int next() override { return ++count_; }
56
57private:
58 int count_ = 0;
59};
60
61int main()
62{
63 std::cout << "=== Service Container Example ===\n\n";
64
65 auto& container = service_container::global();
66 container.clear();
67
68 // Register a singleton greeter (one instance shared)
69 std::cout << "1. Registering services...\n";
70 container.register_factory<IGreeter>(
71 [](IServiceContainer&) { return std::make_shared<FriendlyGreeter>(); },
72 service_lifetime::singleton);
73
74 // Register a transient counter (new instance each time)
75 container.register_factory<ICounter>(
76 [](IServiceContainer&) { return std::make_shared<SequentialCounter>(); },
77 service_lifetime::transient);
78
79 // Resolve services
80 std::cout << "2. Resolving services...\n";
81 auto greeter = container.resolve<IGreeter>();
82 if (greeter.is_ok())
83 {
84 std::cout << " " << greeter.value()->greet("Developer") << "\n";
85 }
86
87 // Singleton: same instance
88 auto greeter2 = container.resolve<IGreeter>();
89 std::cout << "3. Singleton check: same instance = "
90 << (greeter.value().get() == greeter2.value().get() ? "true" : "false")
91 << "\n";
92
93 // Transient: different instances
94 auto counter1 = container.resolve<ICounter>();
95 auto counter2 = container.resolve<ICounter>();
96 std::cout << "4. Transient check: counter1=" << counter1.value()->next()
97 << ", counter2=" << counter2.value()->next() << "\n";
98
99 // Scoped container
100 std::cout << "5. Creating scoped container...\n";
101 auto scope = container.create_scope();
102 if (scope)
103 {
104 std::cout << " Scope created successfully\n";
105 }
106
107 // Freeze container (prevent further registrations)
108 std::cout << "6. Freezing container for production...\n";
109 container.freeze();
110 std::cout << " Frozen = " << (container.is_frozen() ? "true" : "false") << "\n";
111
112 // List registered services
113 auto services = container.registered_services();
114 std::cout << "7. Registered services: " << services.size() << "\n";
115
116 container.clear();
117 std::cout << "\nDone.\n";
118 return 0;
119}
std::string greet(const std::string &name) const override
virtual ~ICounter()=default
virtual int next()=0
virtual ~IGreeter()=default
virtual std::string greet(const std::string &name) const =0
Abstract interface for dependency injection containers.
Definition di.cppm:39
static service_container & global()
Get the global service container instance.
Core interfaces.
Definition adapter.h:21
Umbrella header for Result<T> type and related utilities.
Implementation of the service container for dependency injection.