javascript - 无法将依赖注入派生类
问题描述
我有一个相对简单的设置,包含三个类。我正在使用inversify
依赖注入。但是当将类MessageBroker
注入派生类时Repository
,它MessageBroker
是未定义的:
import 'reflect-metadata';
import { injectable, inject, Container, unmanaged } from 'inversify';
const container = new Container();
const registerProviders = (...providers: any[]) =>
providers.forEach(provider => container.bind(provider.name).to(provider));
const getProvider = (provider): any => container.get(provider.name);
@injectable()
export class MessageBroker {
start = () => console.log('init message broker');
}
@injectable()
export abstract class Repository {
@inject(MessageBroker.name) private mb: MessageBroker;
constructor(@unmanaged() protected readonly user: any) {}
// this.mb is undefined
initialize = () => this.mb.start();
}
@injectable()
export class UserRepository extends Repository {
constructor() {
super({ user: 'some object' });
this.initialize();
}
}
registerProviders(UserRepository, Repository, MessageBroker);
const repo: UserRepository = getProvider(UserRepository);
你可以自己试试。我创建了一个小型 GitHub 存储库:https ://github.com/flulude/stackoverflow-inversify-injected-service-undefined
运行脚本时,我收到此错误:
/project/index.ts:22
initialize = () => this.mb.start();
^
TypeError: Cannot read property 'start' of undefined
at UserRepository.Repository.initialize (/project/index.ts:22:30)
at new UserRepository (/project/index.ts:29:10)
at _createInstance (/project/node_modules/inversify/lib/resolution/instantiation.js:21:12)
at Object.resolveInstance (/project/node_modules/inversify/lib/resolution/instantiation.js:41:18)
at /project/node_modules/inversify/lib/resolution/resolver.js:72:42
at Object.resolve (/project/node_modules/inversify/lib/resolution/resolver.js:96:12)
at /project/node_modules/inversify/lib/container/container.js:319:37
at Container._get (/project/node_modules/inversify/lib/container/container.js:310:44)
at Container.get (/project/node_modules/inversify/lib/container/container.js:230:21)
at getProvider (/project/index.ts:9:50)
PS 在将代码编译为 Javascript 时,我得到了几乎相同的错误
解决方案
您的 MessageBroker 仅设置在内存中,但从未被实例化,这就是它如何获得未定义的错误。在您的构造函数中,您需要设置
this.mb = new MessageBroker();
无需上述行即可执行此操作的另一种方法是将空参数签名构造函数添加到 MessageBroker 类中。
推荐阅读
- ros - 无法使用 mavros 读取 Px4 状态数据
- amazon-web-services - 通过 AWS cli 从 S3 下载文件有效,但通过 python SDK 我收到 403 禁止错误!我正在使用相同的凭据
- ios - M1 Air 上的 React Native 无法为 iOS 构建
- java - 需要帮助以通用模式将 JavaObject 转换为 Json
- c# - 包发布者名称
- java - 获取 ManyToMany JPA+Hibernate 的集合时出错
- php - 在 Lumen 测试期间无法使用外观
- javascript - 如何编写一个生成唯一随机数列表的有效算法?
- angular - Angular - 错误 TS2322:类型“对象”不可分配给国家列表的类型“从不 []”
- c - 为什么我的二进制到十进制转换器程序中只有前 2 个输出正确?