Как сохранить синглтоны между различными экземплярами инжектора?

#python #dependency-injection #singleton

Вопрос:

Я использую модуль инжектора в Python для создания одноэлементных объектов и автоматического внедрения их в другие классы. Таким образом, инициализация обрабатывается автоматически, и создается только один экземпляр каждого класса, поэтому информация передается между объектами очень легко, поскольку все они ссылаются и используют один и тот же экземпляр каждого объекта.

По какой-то причине я хочу инициализировать некоторые классы не на этапе инициализации других классов, а позже во время выполнения моей программы. Однако я хотел бы по-прежнему использовать свойство singleton и инициализировать эти дополнительные классы теми же объектами, которые также используют другие классы.

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

Приведенный ниже код — это фиктивный пример, который я сделал, представляя проблему:

 from injector import singleton, inject, Injector


@singleton
class Factor:
    def __init__(self) -> None:
        self.multiplier: float = 2.0

    def change_multiplier(self):
        self.multiplier = 4.0
        return self.multiplier


@singleton
class Fudge:
    @inject
    def __init__(self, factor: Factor) -> None:
        self.factor = factor
        self.fudge: float = self.factor.change_multiplier()


@singleton
class Multiplier1:
    @inject
    def __init__(self, fudge: Fudge, factor: Factor) -> None:
        self.result = None
        self.x: float = 2.0
        self.y: float = 3.0
        self.fudge = fudge
        self.factor = factor

    def run(self):
        self.result = (self.x   self.y) * self.factor.multiplier
        return self.result


@singleton
class Multiplier2:
    @inject
    def __init__(self, factor: Factor) -> None:
        self.result = None
        self.x: float = 2.0
        self.y: float = 3.0
        self.factor = factor

    def run(self):
        self.result = (self.x   self.y) * self.factor.multiplier
        return self.result


injector1 = Injector()
injector2 = Injector()

app1 = injector1.get(Multiplier1)
app2 = injector2.get(Multiplier2)


print(f"Result of app1 {app1.run()}")
print(f"Result of app2 {app2.run()}")
 

Результат:

 Result of app1 20.0
Result of app2 10.0
 

Инициализация класса Fudge напрямую влияет на результат multiplier1 , поскольку они ссылаются на один и тот же экземпляр factor класса.

Однако, когда multiplier2 позже создается с помощью другого инжектора, он ссылается на другой factor объект.

Как мы можем сделать классы глобальными одиночными?