在Inversify中,为什么更喜欢Constructor / Factory注入toDynamicValue?

时间:2017-10-21 19:52:53

标签: typescript dependency-injection inversifyjs

InversifyJS中,遵循factory injection guideconstructor injection guide 中列出的方法,分别仅使用toDynamicValue注入工厂和构造函数是否有任何特定优势。

1 个答案:

答案 0 :(得分:13)

toConstructor

如果您使用toConstructor,您将能够将参数传递给构造函数,但您将无法解析这些参数(除非您也注入它们)。

container.bind<interfaces.Newable<Katana>>("Newable<Katana>")
         .toConstructor<Katana>(Katana);

toDynamicValue

如果使用toDynamicValue,您将能够将构造函数参数传递给构造函数,并使用context解析这些参数。

container.bind<Katana>("Katana")
        .toDynamicValue((context: interfaces.Context) => {
             return new Katana(context.container.get("SomeDependency")); 
        });

toFactory

如果使用toFactory,您将能够将构造函数参数传递给构造函数并使用context解析这些参数,但您也可以根据工厂参数生成不同的输出。 / p>

container.bind<interfaces.Factory<Weapon>>("Factory<Weapon>")
         .toFactory<Weapon>((context: interfaces.Context) => {
             return (throwable: boolean) => {
                 if (throwable) {
                     return context.container.getTagged<Weapon>(
                         "Weapon", "throwable", true
                     );
                 } else {
                     return context.container.getTagged<Weapon>(
                         "Weapon", "throwable", false
                     );
                 }
             };
         });