我正在尝试在我的typescript应用程序中使用InversifyJS进行依赖注入。当我按照文档中给出的简单示例操作时,一切都运行得很好。但是,依赖项不会被注入到依赖链中较低的类中。希望这个例子能让我想说的更清楚。我删除了尽可能多的样板文件:
EmployeeFactory.ts
@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);
}
}Company.ts
@injectable()
class Company {
@inject('EmployeeFactory') private employeeFactory: EmployeeFactory;
public getEmployees() {
return [
this.employeeFactory.create('Alice'),
this.employeeFactory.create('Bob')
]
}
}Employee.ts
@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);所以我的问题是:在我的应用程序中没有"myContainer“的情况下,如何将EmployeeFactory注入Employee类?我确信我错过了关于InversifyJS的一些重要的东西,所以任何帮助都是感激不尽的。
发布于 2019-11-26 18:36:40
这里的问题是,类Employee只使用操作符new创建,而不是使用inversifyJS创建。因此,您只需通过JS创建新实例,而无需任何依赖注入。
如果只想让代码正常工作,只需将代码重写为smth即可,如下所示
EmployeeFactory.ts
@injectable()
class EmployeeFactory {
create = (employeeName: string): Employee => {
return new Employee(this, employeeName);
}
}Employee.ts
@injectable()
class Employee {
constructor(
private _employeeFactory: EmployeeFactory,
readonly name: string,
) {}
public getBoss(): Employee {
return this._employeeFactory.create("Boss man")
}
}但是如果你想让它倒置,那么你需要使用工厂注入:https://github.com/inversify/InversifyJS/blob/master/wiki/factory_injection.md
然后,需要将绑定中的代码更改为
myContainer.bind<Company>('Company').to(Company);
myContainer.bind<Employee>('Employee').toConstructor(Employee);
container.bind<interfaces.Factory<Employee>>('Factory<Employee>').toFactory<Employee>((context: interfaces.Context) => {
return (name: string) => {
const EmployeeConstructor = context.container.get<Employee>('Employee');
return new EmployeeConstructor(name);
};
});Company.ts
@injectable()
class Company {
@inject('Factory<Employee>') private employeeFactory: (name: string) => Employee;
public getEmployees() {
return [
this.employeeFactory('Alice'),
this.employeeFactory('Bob')
]
}
}https://stackoverflow.com/questions/44864238
复制相似问题