在不实现其接口的情况下调用NestJS生命周期方法



我有一个关于NestJS的小问题。在我的代码中,有一个服务看起来像这样:

import { Inject, Injectable } from '@nestjs/common';
import neo4j, { Driver, int, Result, Transaction } from 'neo4j-driver';
import { Neo4jConfig } from './neo4j-config.interface';
import { NEO4J_CONFIG, NEO4J_DRIVER } from './neo4j.constants';
@Injectable()
export class Neo4jService {
constructor(
@Inject(NEO4J_CONFIG) private readonly config: Neo4jConfig,
@Inject(NEO4J_DRIVER) private readonly driver: Driver,
) {}
onApplicationBootstrap() {
console.log('Hello');
}
getDriver(): Driver {
return this.driver;
}
getConfig(): Neo4jConfig {
return this.config;
}
int(value: number) {
return int(value);
}
beginTransaction(database?: string): Transaction {
const session = this.getWriteSession(database);
return session.beginTransaction();
}
getReadSession(database?: string) {
return this.driver.session({
database: database || this.config.database,
defaultAccessMode: neo4j.session.READ,
});
}
getWriteSession(database?: string) {
return this.driver.session({
database: database || this.config.database,
defaultAccessMode: neo4j.session.WRITE,
});
}
read(
cypher: string,
params?: Record<string, unknown>,
databaseOrTransaction?: string | Transaction,
): Result {
if (databaseOrTransaction instanceof Transaction) {
return (<Transaction>databaseOrTransaction).run(cypher, params);
}
const session = this.getReadSession(<string>databaseOrTransaction);
return session.run(cypher, params);
}
write(
cypher: string,
params?: Record<string, unknown>,
databaseOrTransaction?: string | Transaction,
): Result {
if (databaseOrTransaction instanceof Transaction) {
return (<Transaction>databaseOrTransaction).run(cypher, params);
}
const session = this.getWriteSession(<string>databaseOrTransaction);
return session.run(cypher, params);
}
private onApplicationShutdown() {
console.log('Goodbye')
return this.driver.close();
}
}

'然后在我的主。我有这个方法叫做:

await app.listen(port);

你可以看到我的服务既不实现onApplicationBootstrap也不实现onApplicationShutdown。为什么这些方法仍然会被调用?我应该实现onApplicationBootstrap和onApplicationShutdown或不?正如你也可以看到,我想我的onApplicationBootstrap是一个私有方法,这将是不可能的,如果我实现接口。所以,我想问你:

  • 为什么两个生命周期方法调用事件没有实现接口?
  • 我应该实现这些接口还是继续使用允许我将它们定义为私有的方法?

我希望这些方法不实现接口就不能工作

Typescript接口是用来帮助我们开发的。它在运行时不存在,没有关于它的信息,所以Nest唯一能做的就是检查"嘿,这个类有onModuleInit方法吗? "如果是,将其添加到要调用onModuleInit的类列表中。对其他生命周期方法执行同样的操作。

接口不是明确必需的,但它们确实让我们开发人员通过查看export class...行来更好地了解类,因为我们可以看到实现/扩展的内容。

最新更新