首页 > 解决方案 > Inversify 实例未正确注入

问题描述

usersController 试图调用 getUsers 以响应用户的请求,但我收到此错误

TypeError:无法读取未定义的属性“getUsers”

我不知道这是什么原因。我见过一些类似的问题,但无法解决。

有人能帮我吗?

顺便一提。我们还将反射元数据导入 index.ts。

使用箭头功能没有帮助。

  @Get('/')
  public getAll = async () => {
    return await this.userService.getUsers();
  };

ーーーーーーーーーーーーーーーーーーーーーーーー</p>

用户控制器.ts

import {
  JsonController,
  Param,
  Body,
  Get,
  Post,
  Put,
  Delete,
  QueryParam,
} from 'routing-controllers';
import IUserService from '@src/application/service/users/IUserService';
import {injectable, inject} from 'inversify';
import {TYPES} from '../../constants/types';

@injectable()
@JsonController('/users')
export class UserController {
  private userService: IUserService;

  constructor(@inject(TYPES.UserService) userService: IUserService) {
    this.userService = userService;
  }

  @Get('/')
  async getAll() {
    return await this.userService.getUsers();
  }

  @Get('/:id')
  async getOne(@Param('id') id: number) {
    return await this.userService.getUser(id);
  }
}

反转-config.ts

import {Container} from 'inversify';
import {TYPES} from '../constants/types';

// interfaces
import IUserService from '@src/application/service/users/IUserService';
import IUserRepository from '@src/model/repository/user/interfaces/IUserRepository';

// implementations
import UserService from '@src/application/service/users/UserService';
import UserRepository from '@src/model/repository/user/UserRepository';

const container = new Container();
//users
container.bind<IUserService>(TYPES.UserService).to(UserService);
container.bind<IUserRepository>(TYPES.UserRepository).to(UserRepository);

export {container};

类型.ts

const TYPES = {
  //user
  UserService: Symbol.for('UserService'),
  UserRepository: Symbol.for('UserRepository'),
};
export {TYPES};

用户服务.ts

import {ConnectionManager} from '@src/infrastructure/typeorm/connection';
import {EntityManager, getConnection} from 'typeorm';
import {injectable, inject} from 'inversify';
import {TYPES} from '@src/constants/types';
import IUserRepository from '@src/model/repository/user/interfaces/IUserRepository';
import IUserService from './IUserService';
import UserMap from '@src/model/repository/user/UserMap';

@injectable()
export default class UserService implements IUserService {
  private repository: IUserRepository;

  constructor(
    @inject(TYPES.UserRepository)
    repository: IUserRepository
  ) {
    this.repository = repository;
  }

  public async getUser(id: number) {
    return await this.transaction(async () => {
      const queryResult = await this.repository.getUser(id);
      return UserMap.toDTO(queryResult);
    });
  }

  public async getUsers() {
    return await this.transaction(async () => {
      return await this.repository.getUsers();
    });
  }

  private async transaction<T>(
    func: (manager: EntityManager) => Promise<T>
  ): Promise<T> {
    await ConnectionManager.createConnection();
    return await getConnection().transaction((entityManager: EntityManager) => {
      this.repository.initialize(entityManager);
      return func(entityManager);
    });
  }
}

标签: typescriptinversifyjs

解决方案


推荐阅读