TL;DR:如果注入(inject)的对象是单例,则依赖注入(inject)和单例模式有什么区别?
对于如何解决我目前面临的设计问题,我得到了好坏参半的结果。
我想要一个应用程序范围的配置,以便不同的对象和更改配置。
我想用单例解决这个问题:
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
但是搜索表明这很容易出错并被认为是不好的做法(在管理类状态时)。几乎所有其他帖子都建议使用依赖注入(inject),但他们让我对他们是如何做到的感到困惑。他们都声明“您的实现可以是单例,但将其注入(inject)到构造函数中的其他对象中”。
那将是这样的:
# 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
指的是同一个实例。因此我的困惑...How is this considered Dependency Injection and not Singleton Pattern?
如果它被认为是依赖注入(inject),那么它看起来像单例模式吗?
最佳答案
使用依赖注入(inject) (DI),您将其留给 DI 系统来解决如何获取特定对象。您只需声明您需要什么样的对象。这是对单例模式的补充,其中整个应用程序由特定类型的单个实例提供服务。例如:
class Config:
pass
config = Config() # singleton
class Foo:
def __init__(self):
config = config
这里
Foo
类处理如何获取 Config
的逻辑对象本身。想象一下这个对象本身有依赖关系,那么这也需要通过 Foo
进行排序.另一方面,依赖注入(inject)有一个中央单元来处理这些事情。用户类只是声明它需要什么对象。例如:
class DI:
config = Config()
@classmethod
def get_config_singleton(cls):
return cls.config
@classmethod
def get_config(cls):
return Config()
@classmethod
def inject(cls, func):
from functools import partialmethod
# The DI system chooses what to use here:
return partialmethod(func, config=cls.get_config())
class Foo:
@DI.inject # it's up to the DI system to resolve the declared dependencies
def __init__(self, config: Config): # declare one dependency `config`
self.config = config
关于python - 这是依赖注入(inject)和/或单例模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61602425/