gpt4 book ai didi

typescript - 反转部分注入(inject)

转载 作者:行者123 更新时间:2023-12-05 06:34:31 24 4
gpt4 key购买 nike

如何使用 Inversify 完成部分属性注入(inject)?

假设我们有课

class MyClass {
constructor(
@inject(EXTERNAL_A) private externalA: ExternalClassA,
private b: string
) {}
}

如果 b 的所有可能值在编译时已知,我如何在其他类中将此 MyClass 与 inversify 一起使用。所以,我只需要 MyClass 的实例,一个是 b = "a",另一个是 b = "b"

目前我找到的唯一解决方案是为此定义两个不同的绑定(bind)或使用工厂直接调用 new MyClass

在第一种情况下我只需要写这样的东西

container.bind<MyClass>(CLASS_A).toConstantValue(
new MyClass(container.get<ExternalClassA>(EXTERNAL_A), "a")
);

container.bind<MyClass>(CLASS_B).toConstantValue(
new MyClass(container.get<ExternalClassA>(EXTERNAL_A), "b")
);

看起来很乱,没有解决下一个问题,还有工厂没有解决它。如果在这种情况下我有很深的对象层次结构,我需要通过这个手动对象构建链来构建它们。

这里最好的方法是什么?

带星标的任务,是否可以通过用提供的依赖项替换相同的单一依赖项来解决某些依赖项树?就像,我们可以有类似的东西

 |-----B-----e
A|-----C-----e
|-----D
|-----e

所以我不想用我构建的依赖替换 e 依赖。我怎样才能做到这一点?

最佳答案

您可以使用 toFactory 将工厂绑定(bind)到您的反转容器。请注意,您的工厂可以接受参数。

参见 https://github.com/inversify/InversifyJS/blob/master/wiki/factory_injection.md

这是您的用例的具体示例。

container
.bind<(b: string) => MyClass>("MyClassFactory")
.toFactory<MyClass>((context: interfaces.Context) => {
return (b: string) => {
const classA = context.container.get<ExternalClassA>("EXTERNAL_A")

return new MyClass(classA, b)
}
})

因此我们绑定(bind)到标识符 "MyClassFactory" 一个函数,该函数根据您传递给它的参数返回 MyClass 的实例。

由于我们通过inversify从容器中获取了EXTERNAL_A,我们并没有自己实例化它,所以我们不需要担心它本身有什么依赖。

使用你的工厂...

@injectable()
class SomeClass {
@inject("MyClassFactory") private myClassFactory!: (b: string) => MyClass

someMethod() {
const myClassA = this.myClassFactory('a')
const myClassB = this.myClassFactory('b')
}
}

需要注意的一件事是,在问题中,您正在使用 toConstantValue,因此您的类被构造并绑定(bind)为单例。我不知道这是否是故意的,但如果是这样,您仍然可以使用上述工厂来做到这一点...

container.bind<MyClass>("CLASS_A").toDynamicValue((context: interfaces.Context) => { 
const myClassFactory = context.container.get<(b: string) => MyClass>("MyClassFactory")
return myClassFactory('a')
})

container.bind<MyClass>("CLASS_B").toDynamicValue((context: interfaces.Context) => {
const myClassFactory = context.container.get<(b: string) => MyClass>("MyClassFactory")
return myClassFactory('b')
})

您也可以通过编程方式创建单例。如果您有一些 {identifier: "CLASS_A", factoryArg: 'a'} 类型对象的数组,您可以遍历它并创建如上所述的动态值。

关于您上一个问题,我的回答现在可能太长了,但请查看文档中的这一部分,它可能会有所帮助! https://github.com/inversify/InversifyJS/blob/master/wiki/recipes.md#overriding-bindings-on-unit-tests

关于typescript - 反转部分注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com