pinject依赖注入模块

pinject 是一个基于 Python 的轻量级依赖注入库,可以方便地实现依赖注入的功能。
下面我们将通过一个简单的示例来演示如何使用 pinject 实现依赖注入。

首先,我们需要安装 pinject 库:

pip install pinject
接下来,我们创建两个类:一个名为 EmailSender 的邮件发送器类,另一个名为 NewsletterManager 的新闻通讯管理器类。
其中,NewsletterManager 类依赖于 EmailSender 类,因为它需要调用 EmailSender.send_email() 方法来发送邮件。

python
class EmailSender:
    def send_email(self, to_addr: str, subject: str, body: str):
        print(f"Sending email to {to_addr}\nSubject: {subject}\nBody: {body}")


class NewsletterManager:
    def __init__(self, email_sender: EmailSender):
        self.email_sender = email_sender

    def send_newsletter(self, recipients: List[str], subject: str, body: str):
        for recipient in recipients:
            self.email_sender.send_email(recipient, subject, body)
然后,我们使用 pinject 注册这两个类,并使用 inject 装饰器来实现依赖注入。
inject 装饰器将自动检测所有参数类型,并尝试为其注入合适的实例。


import pinject


class AppModule(pinject.BindingSpec):
    @pinject.provider
    def provide_email_sender(self) -> EmailSender:
        return EmailSender()

    @pinject.provider
    def provide_newsletter_manager(self, email_sender: EmailSender) -> NewsletterManager:
        return NewsletterManager(email_sender)


class App:
    @pinject.inject
    def __init__(self, newsletter_manager: NewsletterManager):
        self.newsletter_manager = newsletter_manager


if __name__ == '__main__':
    obj_graph = pinject.new_object_graph(binding_specs=[AppModule])
    app = obj_graph.provide(App)

    recipients = ['alice@example.com', 'bob@example.com']
    app.newsletter_manager.send_newsletter(recipients, 'Newsletter', 'Hello from our company!')
在这个示例中,我们定义了名为 AppModule 的类,
并使用 pinject.provider 装饰器定义了两个提供者方法:provide_email_sender() 和 provide_newsletter_manager()。
provide_email_sender() 方法返回一个新的 EmailSender 实例;provide_newsletter_manager() 方法接受一个 EmailSender 参数并返回一个新的 NewsletterManager 实例。

然后,我们定义了一个名为 App 的类,并使用 pinject.inject 装饰器将其构造函数标记为可注入的。
在 App 类的构造函数中,我们注入了一个 NewsletterManager 实例,并将其存储在 self.newsletter_manager 属性中。

在主程序中,我们首先创建了一个 AppModule 实例,并通过 new_object_graph() 方法创建了一个新的对象图。
然后,我们调用 obj_graph.provide() 方法来创建一个新的 App 实例,并将其存储在 app 变量中。
最后,我们调用 app.newsletter_manager.send_newsletter() 方法来发送新闻通讯邮件。

在这个示例中,pinject 自动检测到 NewsletterManager 的构造函数需要一个 EmailSender 实例,
并使用 provide_email_sender() 方法提供了一个合适的实例。这样,我们就实现了依赖注入的功能。
posted @ 2023-04-07 21:09  我在路上回头看  阅读(96)  评论(0编辑  收藏  举报