在提供商中不是必需的可注入装饰器?



我正在用一个示例应用程序学习NestJS。

https://github.com/nestjs/nest/tree/master/sample/12-graphql-schema-first

然而,我好奇的是,即使服务没有可注入的装饰器,它也可以被注册为模块的提供商,并且其他提供商的构造函数可以使用注册的提供商,而不使用可注入的装饰器。

实际上,我从src/cats/cats.service中删除了可注入的装饰器。在上面的例子中。但是它工作得很好。

即使没有Injectable装饰器,同样的对象也被传递给了提供者的构造函数。

为什么需要可注入的装饰器?

injectable是允许在该类中注入提供商。如果你没有任何东西要注入,你就不需要那个装饰器。但我建议你经常使用它。

有关此主题的详细信息,请阅读:https://github.com/nestjs/docs.nestjs.com/pull/2481

答案是:"视情况而定"。

如果一个提供商没有注入依赖,那么从技术上讲,你不需要@Injectable()装饰器。这个装饰器在底层所做的是强迫Typescript发出构造函数参数元数据。Nest将在运行时读取这些元数据,以了解被注入到提供程序中的内容。这篇PR更深入地介绍了@Injectable()装饰器本身

如果我们有以下类

@Injectable()
export class Foo {
constructor(private readonly foo: string) {}
}
@Injectable()
export class Bar {
constructor(private readonly bar: string) {}
}
@Injectable()
export class FooBar {
constructor(private readonly foo: Foo, private readonly bar: Bar) {}
}

然后得到如下编译后的输出

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
let Foo = class Foo {
constructor(foo) {
this.foo = foo;
}
};
Foo = __decorate([
Injectable(),
__metadata("design:paramtypes", [String])
], Foo);
export { Foo };
let Bar = class Bar {
constructor(bar) {
this.bar = bar;
}
};
Bar = __decorate([
Injectable(),
__metadata("design:paramtypes", [String])
], Bar);
export { Bar };
let FooBar = class FooBar {
constructor(foo, bar) {
this.foo = foo;
this.bar = bar;
}
};
FooBar = __decorate([
Injectable(),
__metadata("design:paramtypes", [Foo, Bar])
], FooBar);
export { FooBar };

__metadata('design:paramtypes', [])是Nest最终读取的,并匹配DI容器注入令牌

最新更新