背景
我们正在构建一个 Angular2 应用程序,并且正在积累大量与一个模块相关的特定服务。所有这些服务都松散地耦合到 Subject<Type>
应用程序中的事件系统。
通过构造函数实例化
因为这些服务从不被直接引用,并且只订阅事件,所以我们只需要以某种方式实例化它们。目前我们只是将它们注入(inject)到所使用的另一个服务的构造函数中。
// Services not used, just to make sure they're instantiated
constructor(
private appService1: AppService1,
private appService2: AppService2,
private appService3: AppService3,
...
){ }
这似乎有点 hack,有没有更好的方法来显式声明需要实例化的服务而不通过构造函数注入(inject)它们?
最佳答案
另一种确保根据您的偏好实例化服务的模式是将其注入(inject)模块构造函数。
通过这种方式,服务与模块一起实例化。
因此,与其像您在问题中描述的那样创建一个全新的服务只是为了将另一个服务注入(inject)其中,您还可以这样做:
@NgModule ({
...
})
export class SomeModule {
// Services are not used, just to make sure they're instantiated
constructor(
appService1: AppService1,
appService2: AppService2,
appService3: AppService3) {
}
}
与 useValue: new AppService1()
方法相比,这种方法至少有 2 个好处。
第一个也是最明显的一个,如果 AppService1
有依赖项,它们将由 Angular 的 DI 自动解析。
第二个,通常不会在您的应用程序的任何地方实际引用的服务是全局配置服务之王。因此,您可以将此类服务实例化与单个源文件中的全局配置相结合。这是一个例子。在这种情况下,这是 NgbDatepickerConfig
服务:
import { NgModule } from "@angular/core";
import {
NgbDateAdapter, NgbDateNativeUTCAdapter, NgbDateParserFormatter, NgbDatepickerConfig, NgbDatepickerModule,
NgbDropdownModule, NgbTabsetModule
} from "@ng-bootstrap/ng-bootstrap";
import { UsDateParserFormatter } from "./us-date-parser-formatter";
@NgModule({
exports: [
NgbDatepickerModule,
NgbDropdownModule,
NgbTabsetModule
],
providers: [
{ provide: NgbDateAdapter, useClass: NgbDateNativeUTCAdapter },
{ provide: NgbDateParserFormatter, useClass: UsDateParserFormatter }
]
})
export class NgbImportsModule {
public constructor(datepickerConfigService: NgbDatepickerConfig) {
datepickerConfigService.minDate = { year: 1900, month: 1, day: 1 };
datepickerConfigService.maxDate = { year: 2099, month: 12, day: 31 };
}
}
在此示例中,最初引入 NgbImportsModule
只是为了将所需模块从 NGB 重新导出到我的应用程序的其余部分。但是随着我的应用程序功能的增加,NgbImportsModule
变成了一个单一的地方,可以在一个地方方便地配置 NGB 的某些部分。
关于angular - 确保服务已实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41215226/