Angular @Injectable()装饰程序和提供程序数组

Angular @Injectable()装饰程序和提供程序数组,angular,dependency-injection,angular-services,angular-module,Angular,Dependency Injection,Angular Services,Angular Module,@Injectable()decorator中“root”中提供的服务是否仍必须位于模块的providers数组中 这个问题没有给我答案,或者我不太明白 在我的核心文件夹中,我有一个根目录中提供的身份验证服务。我不想为了使用提供的所有服务和组件而将我的核心模块导入应用程序模块 我是否必须在模块的providers数组中另外设置服务,或者已经使用decorator在根级别提供了服务就足够了?您提供的链接中的要点都是注册服务的不同方法,从最不特定到最特定 特定于应用程序-使用@Injectable(

@Injectable()decorator中“root”中提供的服务是否仍必须位于模块的providers数组中

这个问题没有给我答案,或者我不太明白

在我的核心文件夹中,我有一个根目录中提供的身份验证服务。我不想为了使用提供的所有服务和组件而将我的核心模块导入应用程序模块


我是否必须在模块的providers数组中另外设置服务,或者已经使用decorator在根级别提供了服务就足够了?

您提供的链接中的要点都是注册服务的不同方法,从最不特定到最特定

特定于应用程序-使用
@Injectable({providedIn:'root'})

当您在根级别提供服务时,Angular将创建HeroService的单个共享实例,并将其注入任何请求它的类中。在@Injectable()元数据中注册提供程序还允许Angular通过从编译的应用程序中删除服务(如果未使用)来优化应用程序

模块特定-在模块提供程序中注册

当您向特定NgModule注册提供商时,该NgModule中的所有组件都可以使用相同的服务实例。要在此级别注册,请使用@NgModule()decorator的providers属性

组件特定-组件中的寄存器

当您在组件级别注册一个提供程序时,您会在该组件的每个新实例中获得一个新的服务实例。在组件级别,在@component()元数据的providers属性中注册服务提供者

以上所有引用均来自官方页面

  • 如果只有一个模块,那么前两个方法是等效的,只需要使用一个方法。使用
    @Injectable
    ——默认的CLI方法更容易
  • 如果要在多个模块之间共享服务实例,请使用第一种方法
  • 如果希望每个独立模块有一个实例,请使用第二种方法
  • 如果您希望与除一个组件之外的所有组件共享应用程序范围的实例,那么除了对一个组件使用第三种方法外,还可以使用第一种方法
我的观点是,大多数用例将分为前两种方法

注册特定于模块的服务 提示:只需使用“根目录”中提供的
。如果由于树抖动而未使用模块,则不会为该模块编译未使用的服务。声明特定于模块的服务似乎是多余的,正如我们将看到的,可能会导致问题

有两种方法可以注册模块特定的服务—从模块注册或从服务注册

模块

@NgModule({
  providers: [MyService]
})
export class MyModule {}
服务

@Injectable({ providedIn: MyModule })
后者是官方推荐的方法。声明提供者数组是早期的遗留问题

发件人:

上面的示例显示了在模块中提供服务的首选方式。这种方法是首选的,因为如果没有注入服务,它可以使服务的树震动。如果无法在服务中指定应提供服务的模块,还可以在模块中声明服务的提供程序

为什么只使用“根目录”中提供的
所以我们看到这种方法是可以撼动树木的。到现在为止,一直都还不错。但是,如果您只是简单地尝试导入使用客户机的组件在其中声明的同一个模块,那么最终将得到循环引用

采取以下设置:

我的模块

declarations: [
  MyComponent
]
imports: [
  MyModuleServices
],
declarations: [
  MyComponent
]
我的服务

@Injectable({ providedIn: MyModule })
@Injectable({ providedIn: MyModuleServices })
我的组件

constructor(private myService: MyService) {}
constructor(private myService: MyService) {}
  • 我的服务导入我的模块
  • 我的模块导入我的组件
  • 我的组件导入我的服务
存在循环依赖关系

解决方法是创建一个服务模块并将其导入到您的模块中

我的模块

declarations: [
  MyComponent
]
imports: [
  MyModuleServices
],
declarations: [
  MyComponent
]
我的模块服务


我的服务

@Injectable({ providedIn: MyModule })
@Injectable({ providedIn: MyModuleServices })
我的组件

constructor(private myService: MyService) {}
constructor(private myService: MyService) {}

这是一个非常冗长的替代方法,而不是简单地使用“根”中提供的
,让树摇动来完成工作。

您提供的链接中的要点都是注册服务的不同方法,从最不特定到最特定

特定于应用程序-使用
@Injectable({providedIn:'root'})

当您在根级别提供服务时,Angular将创建HeroService的单个共享实例,并将其注入任何请求它的类中。在@Injectable()元数据中注册提供程序还允许Angular通过从编译的应用程序中删除服务(如果未使用)来优化应用程序

模块特定-在模块提供程序中注册

当您向特定NgModule注册提供商时,该NgModule中的所有组件都可以使用相同的服务实例。要在此级别注册,请使用@NgModule()decorator的providers属性

组件特定-组件中的寄存器

当您在组件级别注册一个提供程序时,您会在该组件的每个新实例中获得一个新的服务实例。在组件级别,在@component()元数据的providers属性中注册服务提供者

以上所有引用均来自官方页面

  • 如果只有一个模块,那么前两个方法是等效的,只需要使用一个方法。使用
    @Injectable
    ——默认的CLI方法更容易
  • 如果要在多个模块之间共享服务实例,请使用第一种方法
  • 如果希望每个独立模块有一个实例,请使用第二种方法
  • 如果您希望与除一个组件之外的所有组件共享应用程序范围的实例,那么除了对一个组件使用第三种方法外,还可以使用第一种方法
我的观点是,大多数用例将分为前两种方法

注册特定于模块的服务