@Xveeder

Как правильно создать глобальный контейнер?

Есть некоторый веб-фреймворк, несколько БД и брокер сообщений. Возникла мысль вынести конфиги и соединения с БД из контекста фреймворка в некоторый общий контейнер, состояние которого не зависит от контекста фреймворка, а доступ к этим ресурсом шарится между всеми потребителями (брокер сообщений, API).

Вопрос заключается в том, как правильно создать контейнер для ресурсов таким образом, чтобы его состояние сохранялось на на всем протяжении существования приложения.

Можно инстанцировать объект класса-контейнера и получать к нему доступ через функцию с кешированием, но может быть есть более правильный путь?
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
@GofMan33333
Вы можете создать класс, который будет хранить состояние ресурсов и предоставлять к нему доступ через свойства или методы. Вам может потребоваться реализовать синглтон-паттерн, чтобы обеспечить, что экземпляр этого класса существует только в одном экземпляре на всем протяжении существования приложения. Также вам может потребоваться защитить состояние ресурсов от неправильного использования, реализовав некоторые методы для доступа к ресурсам.

В качестве примера:

from threading import Lock

class ResourceContainer:
    _instance = None
    _lock = Lock()

    def __new__(cls):
        with cls._lock:
            if cls._instance is None:
                cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self):
        self._db_connection = None
        self._message_broker_connection = None
        self._config = {}

    def get_db_connection(self):
        return self._db_connection

    def set_db_connection(self, connection):
        self._db_connection = connection

    def get_message_broker_connection(self):
        return self._message_broker_connection

    def set_message_broker_connection(self, connection):
        self._message_broker_connection = connection

    def get_config(self):
        return self._config

    def set_config(self, config):
        self._config = config


В этом примере создается класс ResourceContainer, который реализует синглтон-паттерн с помощью метода __new__ и мьютекса _lock. Он хранит состояние ресурсов (подключение к БД, подключение к брокеру сообщений, конфигурация) и предоставляет к ним доступ через методы get_* и set_*.

Другие модули или функции могут получить доступ к экземпляру ResourceContainer так:

def foo():
    container = ResourceContainer()
    db_conn = container.get_db_connection()
    # use db_conn

def bar():
    container = ResourceContainer()
    config = container.get_config()
    # use config


Обратите внимание, что каждый раз при вызове ResourceContainer() будет возвращаться один и тот же экземпляр, таким образом состояние ресурсов будет сохраняться на всем протяжении существования приложения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы