ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Lagom Dependency Injection
    python/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

    댓글

Designed by Tistory.