Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python注入_Python_Dependency Injection - Fatal编程技术网

Python注入

Python注入,python,dependency-injection,Python,Dependency Injection,我现在的处境是这样的。我有一个服务类,它使用一个逻辑组件,它使用一个存储对象 因此: 服务-->逻辑-->存储 箭头表示“使用”关系 当然,我正在尝试使用依赖注入,我正在使用injector包() 这里的目标是提供不同版本的服务实例,这些服务实例将使用不同的逻辑实例,所使用的存储实例不同 我认为这是一种表现 现在,重点是:我不知道如何将注入应用到多个级别。这里有一个小例子: from injector import inject, Injector, Module, Key # My exam

我现在的处境是这样的。我有一个服务类,它使用一个逻辑组件,它使用一个存储对象

因此:

服务-->逻辑-->存储

箭头表示“使用”关系

当然,我正在尝试使用依赖注入,我正在使用
injector
包()

这里的目标是提供不同版本的服务实例,这些服务实例将使用不同的逻辑实例,所使用的存储实例不同

我认为这是一种表现

现在,重点是:我不知道如何将注入应用到多个级别。这里有一个小例子:

from injector import inject, Injector, Module, Key

# My example
# Standard service using a ConsumerLogic which is requesting a Storage object


class Storage:
    pass


class Storage2:
    pass


class Logic:

    def __init__(self, storage):
        self.storage = storage


class Service:
    def __init__(self, logic):
        self.logic = logic
通过使用BoundedKey类,我解决了一些问题:

from injector import inject, Injector, Module, Key

# My example
# Standard service using a ConsumerLogic which is requesting a Storage object


LogicKey = Key('Logic')


class Storage:
    pass


class Storage2:
    pass


class Logic:
    @inject
    def __init__(self, storage: Storage):
        self.storage = storage


class Service:
    @inject(logic=LogicKey)
    def __init__(self, logic):
        self.logic = logic


class Configuration(Module):

    def configure(self, binder):
        binder.bind(
            LogicKey,
            to=Logic(storage=Storage())
        )
要使用Instance服务,我可以:

inj = Injector()
inj.get(Service)
获取该服务的特定版本

如何使
get
方法返回不同版本的服务?我无法用模块方法解决一些问题。但我肯定错过了什么


提前感谢您的帮助。

为什么需要注射?只需将您想要的实例传递给您想要的构造函数,所有内容都将按照您想要的方式进行配置。除非你有一个真正的用例,否则没有必要获得所有的enterprisey。它是从一个卡夫卡消费者中提取出来的,采用六边形架构设计,1)将消费者的逻辑从样板文件中分离出来,让消费者运行,2)使其易于扩展,这样你仍然可以使用消费者基础设施,只需提供新的服务IStorage接口的适配器。当然,给你一个很快的解释。快就可以了。重要的是你们明白为什么你们需要它,我同意。此外,我正在将框架层与应用程序层紧密分离,DI在这方面会非常有帮助。