我不明白注入依赖是如何工作的。有没有人可以清楚地解释我

Posted

技术标签:

【中文标题】我不明白注入依赖是如何工作的。有没有人可以清楚地解释我【英文标题】:I don't understand how works injection dependency. Is there somebody which can explain me clearly 【发布时间】:2020-08-21 22:56:58 【问题描述】:

我尝试实现一个小的 NestJS 应用程序,我想在其中集成一个任务调度程序。该调度程序的首要任务之一是更新数据库中的数据。此任务服务将使用如下所示的 UserService:

import 
  Injectable,
  Inject,
  UnprocessableEntityException,
  HttpStatus,
 from '@nestjs/common';
import  Repository  from 'typeorm';
import * as bcrypt from 'bcryptjs';
import  User, UserStatus  from './user.entity';
import  LoggerService  from '../../../logger/logger.service';
import  HammerErrors  from 'src/error/hammer.errors';
import * as Config from '../../../config/global.env';

@Injectable()
export class UserService 
  private readonly _logger = new LoggerService(UserService.name);

  constructor(
    @Inject('USER_REPOSITORY')
    private _userRepository: Repository<User>,
  ) 
  ....
  async reactiveBlockedUsers() 
    this._logger.setMethod(this.reactiveBlockedUsers.name);
    this._logger.log(`Update blocked users`);
    await this._userRepository
      .createQueryBuilder('hm_users')
      .update(User)
      .set(
        nextValidDate: null,
      )
      .where(
        `hm_users.nextValidDate IS NOT NULL hm_users.nextValidDate < utc_timestamp()`,
      )
      .execute();
    return null;
  

我的任务服务如下:

import  LoggerService  from '../../../logger/logger.service';
import  UserService  from '../../providers/user/user.service';
import  Injectable  from '@nestjs/common';
import  Cron, CronExpression  from '@nestjs/schedule';

@Injectable()
export class TasksService 
  private _logger = new LoggerService(TasksService.name);

  constructor(private _userService: UserService) 

  @Cron(CronExpression.EVERY_MINUTE)
  async reactiveUsers() 
    this._logger.setMethod(this.reactiveUsers.name);
    this._logger.log(`Reactive blocked users`);
    try 
      await this._userService.reactiveBlockedUsers();
     catch (error) 
      this._logger.log(error);
    
  

  @Cron(CronExpression.EVERY_MINUTE)
  startBatchJobs() 
    this._logger.setMethod(this.startBatchJobs.name);
    this._logger.log(`Start batch job service`);
  

  triggerNotifications() 

任务模块如下:

import  Module  from '@nestjs/common';
import  TasksService  from './tasks.service';
import  UserService  from 'src/shared/providers/user/user.service';
import  Repository  from 'typeorm';

@Module(
  providers: [
    TasksService,
    UserService,
    
      provide: 'USER_REPOSITORY',
      useClass: Repository,
    ,
  ],
)
export class TasksModule 

当我的过程有效时,我有以下陷阱: [INFO] 06/05/2020 19:57:00.024 [TasksService.reactiveUsers] TypeError:无法读取未定义的属性“createQueryBuilder”

或者: (节点:13668)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“createQueryBuilder” 在 Repository.createQueryBuilder (D:\dev\hammer\hammer-server\node_modules\typeorm\repository\Repository.js:17:29) 在 UserService.reactiveBlockedUsers (D:\dev\hammer\hammer-server\dist\src\shared\providers\user\user.service.js:183:14) 在 TasksService.reactiveUsers (D:\dev\hammer\hammer-server\dist\src\shared\services\tasks\tasks.service.js:25:33) 在 CronJob.fireOnTick (D:\dev\hammer\hammer-server\node_modules\cron\lib\cron.js:562:23) 在 Timeout.callbackWrapper [as _onTimeout] (D:\dev\hammer\hammer-server\node_modules\cron\lib\cron.js:629:10) 在 listOnTimeout (internal/timers.js:549:17) 在 processTimers (internal/timers.js:492:7) (节点:13668)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:2) (节点:13668)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

当我抑制 try catch 时。

对我来说,提供在 UserService 中注入的 Repositiry 模块是一个问题,但我不明白它是如何工作的以及如何解决这个问题。

如果有人有想法,我会很感兴趣。

感谢您的帮助。

【问题讨论】:

您的标题听起来与此问题完全相同:***.com/questions/130794/what-is-dependency-injection,但您的问题本身似乎与您的特定代码中的特定错误有关。如果标题更具体地针对您的问题,您的问题将更有可能得到答案:) 【参考方案1】:

Repository是TypeORM中的抽象类,不能直接实例化。 Nest 会尽其所能解决这个问题,但最终它会提供一个undefined,因此,调用createQueryBuilder 会给您带来问题。当您使用 TypeORM 时,您是否有理由不使用 @nestjs/typeorm 包?它管理为您创建存储库类并使事情变得更容易。你对不使用这个包很生气,你总是可以创建你自己的 Repository 类UserRepository extends Repository 用适当的元数据和所有装饰,然后使用那个类而不是Repository

【讨论】:

【参考方案2】:

感谢您提供有关此现有软件包的信息。我会努力执行你的提议。我是这些技术的新手,我每天都会发现一些新东西。从三月初开始,我学习了 HTML、CSS、javascript、Typescript NestJs 和 Angular,现在我尝试用所有这些技术来实现一个小项目。我认为我的知识有很多漏洞,我很感激你的回答给我这些信息。

【讨论】:

您可以查看这部分文档docs.nestjs.com/techniques/database#typeorm-integration

以上是关于我不明白注入依赖是如何工作的。有没有人可以清楚地解释我的主要内容,如果未能解决你的问题,请参考以下文章

依赖倒置依赖注入和控制反转傻傻分不清楚?

如何 在Vim工作?

Python BUG 或者我不明白编码是如何工作的? len、find 和 re.search 在没有空的、成功的 subprocess.communicate() 执行结果的情况下啥也不做

如何通俗的理解java的依赖注入

WebRTC 是如何工作的?

MekaVerse NFT 智能合约正在使用 ECDSA,但我不明白它是如何工作的