-
Lagom Dependency Injectionpython/lagom 2023. 1. 16. 11:11
python dependency injection library 인 lagom 을 사용해 본다.
from abc import ABC from lagom import Container, Singleton class Base(ABC): def show(self): pass class A(Base): def __init__(self) -> None: print('make a') def show(self): print('show a') class A2(Base): def __init__(self) -> None: print('make a2') def show(self): print('show a2') class B: def __init__(self, a: Base) -> None: print('make b') def show(self): print('show b') class C: def __init__(self, base: Base, b: B) -> None: self.base = base self.b = b print('make c') def show(self): self.base.show() self.b.show() def create_container() -> Container: container: Container = Container() container[B] = Singleton(B) # B 를 만들기 위해서는 A 가 필요한데, 아직 A 는 정의되지 않은 상태임, 이렇게 순서 상관없이 정의 가능 # container[B] = B(container[Base]) # container[B] = lambda c: B(c[B]) # 호출할 때 마다 C 객체가 만들어 짐 container[Base] = Singleton(A) # container[Base] = A() # 이렇게 직접 A() 를 생성하면 eagarly 초기화 되므로 가능하면 이렇게 사용은 피하자? container[C] = Singleton(C) return container def main(): container: Container = create_container() container[C].show() def test(): container: Container = create_container() test_container = container.clone() test_container[Base] = A2() test_container[C].show() if __name__ == '__main__': main() print("-------------------") test()
출력 결과
make a make b make c show a show b ----------------------- make a2 make b make c show a2 show b