dependency-injection - Angular 2 中的依赖注入(inject)

标签 dependency-injection angular angular2-services

我认为 DI 的实现是为了允许在应用程序上使用相同的服务,并根据需要更改它们。然而这个片段(Angular 2.0.0-beta.0)拒绝工作:

# boot.ts
import {ProjectService} from './project.service'

bootstrap(AppComponent, [ProjectService]);



# my.component.ts
export class MyComponent {
    constructor(project: ProjectService) {
    }
}

并且具有明确的服务要求,它可以工作:

# my.component.ts
import {ProjectService} from './project.service';
export class MyComponent {
    constructor(project: ProjectService) {
    }
}

官方文档有些不一致,但在 plunkr 示例中有相同的内容:

# boot.ts
import {HeroesListComponent} from './heroes-list.component';
import {HeroesService}       from './heroes.service';

bootstrap(HeroesListComponent, [HeroesService])



# heroes-list.component.ts
import {HeroesService} from './heroes.service';

这是 DI 使用的预期方式吗?为什么我们必须在每个需要它的类中导入服务,如果我们不能只在启动时描述服务,那么好处在哪里?

最佳答案

这实际上与依赖注入(inject)无关。不能在 TS 中使用未导入的类。

此行引用一个类,DI 派生自要注入(inject)实例的类型。

constructor(project: ProjectService) {

如果具体导入未指定类型,DI 无法知道应使用所有可能的 ProjectService 类中的哪一个。

例如,您可以做的是请求类型 (ProjectService) 并获取不同的实现(如 MockProjectServiceEnhancedProjectService 之类的子类) ,...)

bootstrap(HeroesListComponent, [provide(ProjectService useClass: MockProjectService)]);

这样 DI 就会为以下构造函数注入(inject)一个 MockProjectService

 constructor(project: ProjectService) {

关于dependency-injection - Angular 2 中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857839/

相关文章:

javascript - AngularJs 2 : How to debug a service call?(es6 语法)

angular - angular4中的浏览器关闭事件

javascript - 组件中无法访问 Angular 2 提供程序

c# - 如何验证 ASP.NET Core 中的 DI 容器?

angular - 导入导出核心模块和共享模块

Angular::从嵌套导出链接到父 'router-outlet'

javascript - routerlink = "functionName()"页面加载后立即调用

android - Dagger:如果我每次都*想要*一个新实例怎么办?

c# - 如何在维护域驱动设计架构的同时使用 WCF 服务设置 Ninject?

c# - 使用插件覆盖 autofac 注册