TL; DR: В чем разница между внедрением зависимостей и шаблоном синглтона, если внедренный объект является синглтоном? *
Я хотел бы иметь конфигурацию для всего приложения, чтобы разные объекты и изменяли конфигурацию.
Я решил решить эту проблему с помощью Singleton:
class ConfigMeta(type):
_instance = None
def __call__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__call__(*args, **kwargs)
return cls._instance
class Config(metaclass=ConfigMeta):
def __init__(self) -> None:
pass
Но поиск показал, что это подвержено ошибкам и считается плохой практикой (при управлении состояниями классов). Почти в каждом посте предлагается использовать внедрение зависимостей, но они сбивают меня с толку тем, как они это делают. Все они заявляют: «Ваша реализация может быть синглтоном, но вставлять ее в другие объекты в их конструкторах».
Это будет что-то вроде:
# foo.py
from config import Config
class Foo:
def __init__(self):
self.config = Config()
# bar.py
from config import Config
class Bar:
def __init__(self):
self.config = Config()
Однако каждый из них self.config
относится к одному и тому же экземпляру. Отсюда моя путаница ...
Как это считается инъекцией зависимостей, а не шаблоном Singleton?
Если это считается инъекцией зависимостей, как это будет выглядеть как просто Singleton Шаблон?