CCCPaste

Dependency injection and dependency_injector

import random


def _dependency_injection():
    from abc import ABC, abstractmethod

    class DataBaseAbstract(ABC):
        @abstractmethod
        def connect(self):
            pass

    class SQLite(DataBaseAbstract):
        def connect(self):
            print('SQLite: connection with sqlite is completed')

    class MySQL(DataBaseAbstract):
        def connect(self):
            print('MySQL: connection with sqlite is completed')

    class DataBase:
        def __init__(self, db: DataBaseAbstract):
            self.db: DataBaseAbstract = db

        def get_column(self):
            self.db.connect()

    db_sqlite: DataBase = DataBase(SQLite())
    db_sqlite.get_column()

    db_mysql: DataBase = DataBase(MySQL())
    db_mysql.get_column()


def _dependency_injector():
    from dependency_injector import containers, providers

    class Sensor:
        def __init__(self, ip, id):
            self.ip = ip
            self.id = id

    class Server:
        def __init__(self, clients: [Sensor]):
            self.clients: [Sensor] = clients

    class Container(containers.DeclarativeContainer):
        config = providers.Configuration()

        server = providers.Singleton(
            Server,
            clients=config.clients
        )

        sensor = providers.Factory(
            Sensor,
            ip=config.ip,
            id=config.id
        )

    container = Container()
    server = container.server()
    server.clients = [Sensor('127.0.0.1', random.randint(1, 100)) for _ in range(10)]

    print(server.clients)
    print(server.clients[0].ip)


if __name__ == '__main__':
    _dependency_injection()
    _dependency_injector()