我目前正在使用 tsyringe 作为后端,并尝试将单例类注入到另一个可注入类中。 不过,UserServiceImpl 拥有的 MockUserRepository 实例似乎与
container.resolve(MockUserRepository)
不同。
这是我的类定义
@injectable()
export class UserServiceImpl implements UserService {
constructor(
@inject('UserRepository') private userRepository: UserRepository,
) {}
// ...
}
@singleton()
export class MockUserRepository implements UserRepository {
private readonly users: User[] = [];
// ...
}
这是我的 tsyringe 设置和测试代码
container.register('UserRepository', {useClass: MockUserRepository}, {lifecycle: Lifecycle.Singleton });
const userService = container.resolve(UserServiceImpl);
const userRepository = container.resolve(MockUserRepository);
// create user directly to repository
await userRepository.create({
id: 'userId'
});
// user become null
const user = await userService.getUserById('userId');
我检查了 MockUserRepository 是否被 tsyringe 正确识别为单例:
const userRepository1 = container.resolve(MockUserRepository);
const userRepository2 = container.resolve(MockUserRepository);
// create user
await userRepository1.create({
id: 'userId'
});
// user not become null
const user = await userRepository2.find('userId');
我不久前开始使用tsyringe,所以我对它知之甚少。 我如何使用同一个实例?
我的猜测是注入令牌不同。注册时,您使用一个字符串
container.register('UserRepository', {useClass: MockUserRepository}, {lifecycle: Lifecycle.Singleton });
但是当您从容器请求实例时,您使用另一个符号来获取实例
container.resolve(MockUserRepository)
。
如果您使用
container.resolve('UserRepository')
代替,您可能会得到相同的实例。