@@ Injectable()装饰器和提供者数组

问题描述 投票:0回答:2

是否仍必须在@Injectable()装饰器的“ root”中提供的服务仍在模块的providers数组中?

Angular documentation并没有真正给我答案,或者我不太理解。

在我的核心文件夹中,我具有根提供的身份验证服务。为了使用所有提供的服务和组件,我不会将我的核心模块导入应用模块中。

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

angular dependency-injection angular-services angular-module
2个回答
0
投票

您提供的链接中的要点是从最不具体到最具体的所有不同的注册服务方法。

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

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

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

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

特定于组件-在组件中注册

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

以上所有引述均来自Introduction to services and dependency injection官方页面

  • 如果只有一个模块,则前两种方法是等效的,只需要使用一种方法。使用@Injectable-默认的CLI方法更容易。
  • 如果要在多个模块之间共享服务实例,请使用第一种方法。
  • 如果要每个独立模块一个实例,请使用第二种方法。
  • 如果要与除一个组件之外的所有组件共享一个应用程序级实例,则对于一个异常组件,除了第三种方法外,还可以使用第一种方法。

我认为大多数用例都属于前两种方法。

注册模块专用服务

有两种方法注册模块特定的服务-从模块或从服务注册。

模块

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

服务

@Injectable({ providedIn: MyModule })

后者是官方推荐的方法,与上面的官方网站引用语不符。

来自the docs

上面的示例显示了在模块中提供服务的首选方式。此方法是首选方法,因为如果没有注入,它将启用服务的树状摇动。如果无法在服务中指定应由哪个模块提供服务,则也可以在模块内声明服务的提供者。


1
投票

是否执行@Injectable()中“根”中提供的服务装饰器仍必须位于模块的providers数组中吗?

不!

当您使用Angular CLI创建服务时,我相信默认情况下会添加providedIn: "root",因此从技术上讲,您永远不需要将自己的服务之一添加到provider数组中。

我是否必须另外在模块,还是已经在根级别提供了足够的模块使用装饰器?

使用装饰器在根级别提供它就足够了。

但是,并非我创建的所有服务都旨在成为全球性服务。创建服务时,将配置对象删除到@Injectable()元数据的情况并不罕见,该服务将在单个屏幕或子模块之间共享-而不是在整个应用程序中共享。在这种情况下,我将不得不将该服务添加到使用该服务或子模块声明的各个组件上的providers数组。

© www.soinside.com 2019 - 2024. All rights reserved.