Typescript InversifyJS不在嵌套类中注入依赖项
我正在尝试在我的typescript应用程序中使用InversifyJS进行依赖项注入。当我按照文档中给出的简单示例进行操作时,一切都很完美。但是,依赖项不会被注入到依赖链中较低的类中。希望这个例子能让我想说的更清楚。我尽可能多地删除了样板文件: 雇员工厂Typescript InversifyJS不在嵌套类中注入依赖项,typescript,dependency-injection,inversion-of-control,inversifyjs,Typescript,Dependency Injection,Inversion Of Control,Inversifyjs,我正在尝试在我的typescript应用程序中使用InversifyJS进行依赖项注入。当我按照文档中给出的简单示例进行操作时,一切都很完美。但是,依赖项不会被注入到依赖链中较低的类中。希望这个例子能让我想说的更清楚。我尽可能多地删除了样板文件: 雇员工厂 @injectable() class EmployeeFactory { create(employeeName: string): Employee { /* * I think my error
@injectable()
class EmployeeFactory {
create(employeeName: string): Employee {
/*
* I think my error comes from the use of
* the new keyword right here. Not sure though.
*/
return new Employee(employeeName);
}
}
公司
@injectable()
class Company {
@inject('EmployeeFactory') private employeeFactory: EmployeeFactory;
public getEmployees() {
return [
this.employeeFactory.create('Alice'),
this.employeeFactory.create('Bob')
]
}
}
雇员培训
@injectable()
class Employee {
@inject('EmployeeFactory') private employeeFactory: EmployeeFactory;
constructor(readonly name: string) {
}
public getBoss(): Employee {
//TypeError: Cannot read property 'create' of undefined
return this.employeeFactory.create("Boss man")
}
}
然后这是我运行以获取错误的代码
import { Container } from "inversify";
let myContainer = new Container();
myContainer.bind<EmployeeFactory>("EmployeeFactory").to(EmployeeFactory);
myContainer.bind<Company>('Company').to(Company);
myContainer.bind<Employee>('Employee').to(Employee);
let oscorp: Company = myContainer.get<Company>('Company');
let employees: Employee[] = oscorp.getEmployees();
console.log('employees', employees);
// PRINTS: employees [ Employee { name: 'Alice' }, Employee { name: 'Bob' } ]
let boss = employees[0].getBoss();
console.log('boss', boss);
从“inversify”导入{Container};
让myContainer=新容器();
myContainer.bind(“EmployeeFactory”)。至(EmployeeFactory);
myContainer.bind(公司)与(公司);
myContainer.bind(‘雇员’)至(雇员);
让oscorp:Company=myContainer.get('Company');
让员工:Employee[]=oscorp.getEmployees();
console.log(“员工”,员工);
//打印:雇员[雇员{name:'Alice'},雇员{name:'Bob'}]
让boss=employees[0]。getBoss();
console.log('boss',boss);
所以我的问题是:如何让EmployeeFactory被注入到Employee类中,而不在我的应用程序中使用“myContainer”?我确信我遗漏了一些关于InversifyJS的关键信息,因此非常感谢您的帮助 这里的问题是,类
Employee
仅使用operatornew
创建,而不是使用inversifyJS。因此,您只需通过JS创建新实例,而无需任何依赖项注入
如果您只想让代码正常工作,您可以简单地将代码重写为smth
雇员工厂
@injectable()
工人阶级工厂{
create=(employeeName:string):Employee=>{
返回新员工(此,employeeName);
}
}
雇员培训
@injectable()
class Employee {
@inject('EmployeeFactory') private employeeFactory: EmployeeFactory;
constructor(readonly name: string) {
}
public getBoss(): Employee {
//TypeError: Cannot read property 'create' of undefined
return this.employeeFactory.create("Boss man")
}
}
@injectable()
班级员工{
建造师(
私人雇员工厂:雇员工厂,
只读名称:string,
) {}
public getBoss():Employee{
返回此项。_employeeFactory.create(“老板人”)
}
}
但如果您想采用反向方式,则需要使用工厂注射:
然后,您需要将绑定中的代码更改为
myContainer.bind('Company')。至(Company);
myContainer.bind(‘雇员’).toConstructor(雇员);
container.bind('Factory').toFactory((上下文:interfaces.context)=>{
返回(名称:字符串)=>{
const EmployeeConstructor=context.container.get('Employee');
返回新员工(姓名);
};
});
公司
@injectable()
class Company {
@inject('EmployeeFactory') private employeeFactory: EmployeeFactory;
public getEmployees() {
return [
this.employeeFactory.create('Alice'),
this.employeeFactory.create('Bob')
]
}
}
@injectable()
阶级公司{
@inject('Factory')私有employeeFactory:(名称:string)=>Employee;
公职人员(){
返回[
本公司员工工厂(“Alice”),
此.employeeFactory('Bob'))
]
}
}
这里的问题是,类员工
仅使用操作员新建
,而不是使用inversifyJS创建。因此,您只需通过JS创建新实例,而无需任何依赖项注入
如果您只想让代码正常工作,您可以简单地将代码重写为smth
雇员工厂
@injectable()
工人阶级工厂{
create=(employeeName:string):Employee=>{
返回新员工(此,employeeName);
}
}
雇员培训
@injectable()
class Employee {
@inject('EmployeeFactory') private employeeFactory: EmployeeFactory;
constructor(readonly name: string) {
}
public getBoss(): Employee {
//TypeError: Cannot read property 'create' of undefined
return this.employeeFactory.create("Boss man")
}
}
@injectable()
班级员工{
建造师(
私人雇员工厂:雇员工厂,
只读名称:string,
) {}
public getBoss():Employee{
返回此项。_employeeFactory.create(“老板人”)
}
}
但如果您想采用反向方式,则需要使用工厂注射:
然后,您需要将绑定中的代码更改为
myContainer.bind('Company')。至(Company);
myContainer.bind(‘雇员’).toConstructor(雇员);
container.bind('Factory').toFactory((上下文:interfaces.context)=>{
返回(名称:字符串)=>{
const EmployeeConstructor=context.container.get('Employee');
返回新员工(姓名);
};
});
公司
@injectable()
class Company {
@inject('EmployeeFactory') private employeeFactory: EmployeeFactory;
public getEmployees() {
return [
this.employeeFactory.create('Alice'),
this.employeeFactory.create('Bob')
]
}
}
@injectable()
阶级公司{
@inject('Factory')私有employeeFactory:(名称:string)=>Employee;
公职人员(){
返回[
本公司员工工厂(“Alice”),
此.employeeFactory('Bob'))
]
}
}
您是否找到了解决方案?显示您收到的错误信息。从我的一瞥中可以看出,您应该解耦其他对象的容器表示。应用装饰器后,inversifyjs负责类的对象创建。不要这样使用它`您是否偶然发现了此问题的解决方案?显示您收到的错误信息。从我的一瞥中可以看出,您应该解耦其他对象的容器表示。应用装饰器后,inversifyjs负责类的对象创建。不要这样使用它`