如何在多个注入实例之间共享一个瞬态对象实例?
How share a transient object instance between multiple injected instances?
在 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 容器,使得注入的实例 foo1
和 foo2
在注入 Controller 时获得相同的 bar 实例某处。
我能想到的显而易见的方法是:
要将 Foo1 和 Foo2 注册为 constructors/newables,将它们注入 ControllerFactory
中,该 ControllerFactory
使用公共条对象实例化它们。
使用hierarchical DI并在每次需要实例化新控制器时创建的子容器中将bar注册为单例。
我不认为 1 是理想的,因为需要显式实例化。
有没有更好的方法来处理这个问题?
您正在寻找的是请求范围,但目前尚不可用。请求范围允许您为当前请求的上下文定义单例。
对于一般用例,实现起来会很困难,但对于 HTTP 服务器,可以模拟它。如果您希望每个 HTTP 请求在请求的上下文中将所有依赖项视为单例。
您可以为每个 HTTP 请求创建一个容器克隆,但这可能不是很有效。我建议等到正式支持它,这样你就可以做到:
container.bind<IFoo>("IFoo").to(Foo).inRequestScope();
container.bind<IBar>("IBar").to(Bar).inRequestScope();
container.bind<Controller>("Controller").to(FooBarController)
.whenTargetNamed("FooBar");
在 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 容器,使得注入的实例 foo1
和 foo2
在注入 Controller 时获得相同的 bar 实例某处。
我能想到的显而易见的方法是:
要将 Foo1 和 Foo2 注册为 constructors/newables,将它们注入
ControllerFactory
中,该ControllerFactory
使用公共条对象实例化它们。使用hierarchical DI并在每次需要实例化新控制器时创建的子容器中将bar注册为单例。
我不认为 1 是理想的,因为需要显式实例化。
有没有更好的方法来处理这个问题?
您正在寻找的是请求范围,但目前尚不可用。请求范围允许您为当前请求的上下文定义单例。
对于一般用例,实现起来会很困难,但对于 HTTP 服务器,可以模拟它。如果您希望每个 HTTP 请求在请求的上下文中将所有依赖项视为单例。
您可以为每个 HTTP 请求创建一个容器克隆,但这可能不是很有效。我建议等到正式支持它,这样你就可以做到:
container.bind<IFoo>("IFoo").to(Foo).inRequestScope();
container.bind<IBar>("IBar").to(Bar).inRequestScope();
container.bind<Controller>("Controller").to(FooBarController)
.whenTargetNamed("FooBar");