乐闻世界logo
搜索文章和话题

如何在inversify中注入异步依赖项?

1 个月前提问
1 个月前修改
浏览次数39

1个答案

1

在Inversify中,要注入异步依赖项,我们通常需要将这些依赖项包装在一个可以同步返回的构造或工厂函数中。Inversify本身不直接支持异步依赖注入,因为它的设计目标是同步的依赖注入容器。然而,我们可以通过一些设计模式来间接实现异步依赖的注入。以下是实现这一功能的一种方法:

使用工厂方法

  1. 定义异步依赖项: 首先,定义你的异步依赖项。这通常是一个返回Promise的函数或者可能是一个异步获取资源的类。

    typescript
    class AsyncDependency { async getData() { const data = await fetchSomeData(); return data; } }
  2. 创建一个工厂函数: 接下来,创建一个工厂函数,这个函数负责创建异步依赖项的实例。工厂函数本身是同步的,但它返回的是一个Promise,该Promise解析为异步依赖的实例。

    typescript
    const asyncDependencyFactory = () => { const asyncDependency = new AsyncDependency(); return asyncDependency; };
  3. 在Inversify容器中注册工厂: 将工厂函数作为绑定到Inversify容器。你可以使用toFactory方法来实现。

    typescript
    import { Container, interfaces } from "inversify"; const container = new Container(); container.bind<AsyncDependency>("AsyncDependency").toFactory<AsyncDependency>((context: interfaces.Context) => asyncDependencyFactory);
  4. 注入并使用工厂: 在需要异步依赖项的类中,你可以注入这个工厂,使用时通过工厂创建依赖项。

    typescript
    import { inject, injectable } from "inversify"; @injectable() class SomeService { constructor(@inject("AsyncDependency") private asyncDependencyFactory: () => Promise<AsyncDependency>) {} async useDependency() { const asyncDependency = await this.asyncDependencyFactory(); const data = await asyncDependency.getData(); console.log(data); } }

总结

虽然Inversify不直接支持异步依赖注入,通过使用工厂方法,我们可以有效地将异步行为封装在可管理的同步API中。这种方法保持了Inversify容器的同步和预测性质,同时提供了异步操作的灵活性。

通过上述例子,我们可以看到整个过程中如何使用Inversify来管理那些需要异步初始化的依赖项,并确保系统的整体架构保持清晰和一致。

2024年8月3日 16:46 回复

你的答案