如何用tsyringe将单例注入injectable?

问题描述 投票:0回答:1

我目前正在使用 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,所以我对它知之甚少。 我如何使用同一个实例?

typescript tsyringe
1个回答
0
投票

我的猜测是注入令牌不同。注册时,您使用一个字符串

container.register('UserRepository', {useClass: MockUserRepository}, {lifecycle: Lifecycle.Singleton });

但是当您从容器请求实例时,您使用另一个符号来获取实例

container.resolve(MockUserRepository)

如果您使用

container.resolve('UserRepository')
代替,您可能会得到相同的实例。

© www.soinside.com 2019 - 2024. All rights reserved.