Skip to content

Commit 9b43b0e

Browse files
committed
Add support for registering instances.
1 parent f35f441 commit 9b43b0e

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

src/dependency_injection/container.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ def register_singleton(self, dependency: Type, implementation: Optional[Type] =
5050
raise ValueError(f"Dependency {dependency} is already registered.")
5151
self._registrations[dependency] = Registration(dependency, implementation, Scope.SINGLETON, tags, constructor_args)
5252

53+
def register_instance(self, dependency: Type, instance: Any, tags: Optional[set] = None) -> None:
54+
if dependency in self._registrations:
55+
raise ValueError(f"Dependency {dependency} is already registered.")
56+
self._registrations[dependency] = Registration(dependency, type(instance), Scope.SINGLETON, constructor_args={}, tags=tags)
57+
self._singleton_instances[dependency] = instance
58+
5359
def resolve(self, dependency: Type, scope_name: str = DEFAULT_SCOPE_NAME) -> Type:
5460
if scope_name not in self._scoped_instances:
5561
self._scoped_instances[scope_name] = {}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import pytest
2+
3+
from dependency_injection.container import DependencyContainer
4+
from unit_test.unit_test_case import UnitTestCase
5+
6+
7+
class TestRegisterInstance(UnitTestCase):
8+
9+
def test_register_instance_succeeds_when_not_previously_registered(
10+
self,
11+
):
12+
# arrange
13+
class Vehicle:
14+
pass
15+
16+
class Car(Vehicle):
17+
pass
18+
19+
dependency_container = DependencyContainer.get_instance()
20+
instance = Car()
21+
22+
# act
23+
dependency_container.register_instance(Vehicle, instance)
24+
25+
# assert
26+
# (no exception thrown)
27+
28+
def test_register_instance_fails_when_already_registered(
29+
self,
30+
):
31+
# arrange
32+
class Vehicle:
33+
pass
34+
35+
class Car(Vehicle):
36+
pass
37+
38+
dependency_container = DependencyContainer.get_instance()
39+
instance = Car()
40+
dependency_container.register_instance(Vehicle, instance)
41+
42+
# act + assert
43+
with pytest.raises(ValueError, match="is already registered"):
44+
dependency_container.register_instance(Vehicle, instance)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from dependency_injection.container import DependencyContainer
2+
from unit_test.unit_test_case import UnitTestCase
3+
4+
5+
class TestResolveInstance(UnitTestCase):
6+
7+
def test_resolve_instance_returns_instance(
8+
self,
9+
):
10+
# arrange
11+
class Vehicle:
12+
pass
13+
14+
class Car(Vehicle):
15+
pass
16+
17+
dependency_container = DependencyContainer.get_instance()
18+
instance = Car()
19+
dependency_container.register_instance(Vehicle, instance)
20+
21+
# act
22+
resolved_dependency = dependency_container.resolve(Vehicle)
23+
24+
# assert
25+
self.assertEqual(resolved_dependency, instance)
26+
27+
def test_resolve_instance_twice_returns_same_instance(
28+
self,
29+
):
30+
# arrange
31+
class Vehicle:
32+
pass
33+
34+
class Car(Vehicle):
35+
pass
36+
37+
dependency_container = DependencyContainer()
38+
instance = Car()
39+
dependency_container.register_instance(Vehicle, instance)
40+
41+
# act
42+
resolved_dependency_1 = dependency_container.resolve(Vehicle)
43+
resolved_dependency_2 = dependency_container.resolve(Vehicle)
44+
45+
# assert
46+
self.assertEqual(resolved_dependency_1, resolved_dependency_2)

0 commit comments

Comments
 (0)