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

我正在尝试在我的typescript应用程序中使用InversifyJS进行依赖项注入。当我按照文档中给出的简单示例进行操作时,一切都很完美。但是,依赖项不会被注入到依赖链中较低的类中。希望这个例子能让我想说的更清楚。我尽可能多地删除了样板文件:

雇员工厂

@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
仅使用operator
new
创建,而不是使用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负责类的对象创建。不要这样使用它`