python - 这是依赖注入(inject)和/或单例模式吗?

标签 python oop design-patterns dependency-injection singleton

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/

相关文章:

javascript - 在 javascript 中增强继承的函数

oop - if-less 编程(基本上没有条件)

design-patterns - 监听事件、将事件分组并批量提交的最佳实践是什么?

python - 如何在Django View 中乘以success_url?

python - 超 HTTP2 自定义 SSLContext 错误

python - Groupby 和 sum 行以聚合 PRODUCT 列的多个值

java - 如何在不使用 try catch block 的情况下捕获 "throws Exeception"?

python - 从一系列数字生成二进制数据数组

javascript - 有人可以解释这个 OOP javascript 结构吗

c# - 成本计算器应用程序的设计模式?