0

在 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在控制器注入某处时获得相同的 bar 实例。

我能想到的明显方法是:

  1. 要将 Foo1 和 Foo2 注册为constructors/newables,请将它们注入到一个ControllerFactory使用公共 bar 对象实例化它们的 a 中。

  2. 使用分层 DI并将 bar 注册为子容器中的单例,该子容器在每次需要实例化新控制器时创建。

由于需要显式实例化,我认为 1 并不理想。

有没有更好的方法来处理这个?

4

1 回答 1

2

您正在寻找的是请求范围,但它尚不可用。请求范围允许您为当前请求的上下文定义单例。

对于一般用例来说很难实现,但在 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");
于 2017-11-01T15:40:18.200 回答