98 auto result = container_.register_simple_factory<
IService>(
99 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::transient);
101 ASSERT_TRUE(result.is_ok());
102 EXPECT_TRUE(container_.is_registered<
IService>());
105 auto service1_result = container_.resolve<
IService>();
106 ASSERT_TRUE(service1_result.is_ok());
107 auto service1 = service1_result.value();
108 EXPECT_NE(service1,
nullptr);
109 EXPECT_EQ(service1->get_name(),
"ServiceA_1");
111 auto service2_result = container_.resolve<
IService>();
112 ASSERT_TRUE(service2_result.is_ok());
113 auto service2 = service2_result.value();
114 EXPECT_NE(service2,
nullptr);
115 EXPECT_EQ(service2->get_name(),
"ServiceA_2");
118 EXPECT_NE(service1, service2);
127 auto result = container_.register_simple_factory<
IService>(
128 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
130 ASSERT_TRUE(result.is_ok());
133 auto service1_result = container_.resolve<
IService>();
134 auto service2_result = container_.resolve<
IService>();
136 ASSERT_TRUE(service1_result.is_ok());
137 ASSERT_TRUE(service2_result.is_ok());
139 auto service1 = service1_result.value();
140 auto service2 = service2_result.value();
143 EXPECT_EQ(service1, service2);
145 EXPECT_EQ(service1->get_name(),
"ServiceA_1");
146 EXPECT_EQ(service2->get_name(),
"ServiceA_1");
154 auto instance = std::make_shared<ServiceA>();
155 auto initial_name = instance->get_name();
157 auto result = container_.register_instance<
IService>(instance);
158 ASSERT_TRUE(result.is_ok());
161 auto resolved_result = container_.resolve<
IService>();
162 ASSERT_TRUE(resolved_result.is_ok());
163 auto resolved = resolved_result.value();
165 EXPECT_EQ(resolved, instance);
166 EXPECT_EQ(resolved->get_name(), initial_name);
175 container_.register_simple_factory<
ServiceA>(
176 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
179 container_.register_factory<
ServiceB>(
180 [](IServiceContainer& c) {
181 auto dep_result = c.resolve<
ServiceA>();
182 if (dep_result.is_err()) {
183 throw std::runtime_error(
"Failed to resolve dependency");
185 return std::make_shared<ServiceB>(dep_result.value());
187 service_lifetime::transient);
190 auto service_result = container_.resolve<
ServiceB>();
191 ASSERT_TRUE(service_result.is_ok());
192 auto service = service_result.value();
194 EXPECT_NE(service,
nullptr);
195 auto dependency = service->get_dependency();
196 EXPECT_NE(dependency,
nullptr);
199 auto dep_result = container_.resolve<
ServiceA>();
200 ASSERT_TRUE(dep_result.is_ok());
201 EXPECT_EQ(dependency, dep_result.value());
210 container_.register_simple_factory<
IService>(
211 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
214 auto scope = container_.create_scope();
215 ASSERT_NE(scope,
nullptr);
218 EXPECT_TRUE(scope->is_registered<
IService>());
221 auto service_result = scope->resolve<
IService>();
222 ASSERT_TRUE(service_result.is_ok());
223 EXPECT_NE(service_result.value(),
nullptr);
249 container_.register_simple_factory<
IService>(
250 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
252 EXPECT_TRUE(container_.is_registered<
IService>());
256 EXPECT_FALSE(container_.is_registered<
IService>());
258 auto resolve_result = container_.resolve<
IService>();
259 EXPECT_TRUE(resolve_result.is_err());
267 container_.register_simple_factory<
IService>(
268 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
270 EXPECT_TRUE(container_.is_registered<
IService>());
272 auto result = container_.unregister<
IService>();
273 EXPECT_TRUE(result.is_ok());
274 EXPECT_FALSE(container_.is_registered<
IService>());
282 auto result1 = container_.register_simple_factory<
IService>(
283 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
284 ASSERT_TRUE(result1.is_ok());
286 auto result2 = container_.register_simple_factory<
IService>(
287 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
288 EXPECT_TRUE(result2.is_err());
296 container_.register_simple_factory<
IService>(
298 std::this_thread::sleep_for(std::chrono::milliseconds(1));
299 return std::make_shared<ServiceA>();
301 service_lifetime::singleton);
304 const int num_threads = 10;
305 std::vector<std::thread> threads;
306 std::vector<std::shared_ptr<IService>> results(num_threads);
308 for (
int i = 0; i < num_threads; ++i) {
309 threads.emplace_back(
310 [
this, &results, i]()
312 auto result = container_.resolve<
IService>();
313 if (result.is_ok()) {
314 results[i] = result.value();
319 for (
auto& t : threads) {
324 auto first = results[0];
325 EXPECT_NE(first,
nullptr);
327 for (
const auto& result : results) {
328 EXPECT_EQ(result, first);
340 container_.register_simple_factory<
IService>(
341 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
343 container_.register_simple_factory<
ServiceA>(
344 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::transient);
346 auto services = container_.registered_services();
347 EXPECT_GE(services.size(), 2u);
355 container_.register_simple_factory<
IService>(
356 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
359 EXPECT_TRUE(container_.is_frozen());
361 auto result = container_.register_simple_factory<
ServiceA>(
362 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::transient);
364 EXPECT_TRUE(result.is_err());
372 container_.register_simple_factory<
IService>(
373 []() {
return std::make_shared<ServiceA>(); }, service_lifetime::singleton);
377 auto result = container_.resolve<
IService>();
378 EXPECT_TRUE(result.is_ok());
379 EXPECT_NE(result.value(),
nullptr);