如何在多个注入实例之间共享瞬态对象实例?

时间:2017-10-22 09:22:29

标签: typescript inversifyjs

在Inversify中,在多个对象之间共享单个对象实例(具有瞬态寿命)的最佳方法是什么。

所以我们说我们有:

@injectable()
class Foo1 {
    @inject("bar")
    private bar: IBar;
}

@injectable()
class Foo2 {
    @inject("bar")
    private bar: IBar;
}

@injectable()
class Controller {
    @inject("foo1")
    private foo1: Foo1;

    @inject("foo2")
    private foo2: Foo2;
}

不使“bar”成为单例,是否可以配置IoC容器,使得注入的实例foo1foo2在Controller注入某处时获得相同的bar实例。

我能想到的显而易见的方法是:

  1. 要将Foo1和Foo2注册为constructors/newables,请将它们注入ControllerFactory,并使用公共条形对象对其进行实例化。

  2. 使用hierarchical DI并将条形图注册为子容器中的单例,每当需要实例化新控制器时,该容器就会创建。

  3. 我不认为1是理想的,因为需要显式实例化。

    有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您正在寻找的是请求范围,但尚未提供。请求范围允许您为当前请求的上下文定义单例。

对于通用用例,很难实现,但在HTTP服务器的情况下,可以模拟它。如果您希望每个HTTP请求将所有依赖项视为请求上下文中的单例。

您可以为每个HTTP请求创建一个Container克隆,但它可能效率不高。我建议等到官方支持,这样你才能做到:

container.bind<IFoo>("IFoo").to(Foo).inRequestScope();
container.bind<IBar>("IBar").to(Bar).inRequestScope();

container.bind<Controller>("Controller").to(FooBarController)
         .whenTargetNamed("FooBar");