在InversifyJS中,遵循factory injection guide和constructor injection guide 中列出的方法,分别仅使用toDynamicValue注入工厂和构造函数是否有任何特定优势。
答案 0 :(得分:13)
如果您使用toConstructor
,您将能够将参数传递给构造函数,但您将无法解析这些参数(除非您也注入它们)。
container.bind<interfaces.Newable<Katana>>("Newable<Katana>")
.toConstructor<Katana>(Katana);
如果使用toDynamicValue
,您将能够将构造函数参数传递给构造函数,并使用context
解析这些参数。
container.bind<Katana>("Katana")
.toDynamicValue((context: interfaces.Context) => {
return new Katana(context.container.get("SomeDependency"));
});
如果使用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
);
}
};
});