Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 您只能通过引导将服务注入服务吗?_Dependency Injection_Angular - Fatal编程技术网

Dependency injection 您只能通过引导将服务注入服务吗?

Dependency injection 您只能通过引导将服务注入服务吗?,dependency-injection,angular,Dependency Injection,Angular,我正在尝试连接一个使用Http服务的基本Angular2应用程序。(我看到的大多数教程都是通过让组件使用Http服务来实现这一点的,除非瘦控制器的基本原理发生了变化,否则这似乎是错误的,但这是一个不同的问题。) 我想创建一个使用Angular的Http服务的服务。但是我不知道如何注入Http服务,除了这个: boot.ts: import {bootstrap} from 'angular2/platform/browser'; import {AppComponent} from './app

我正在尝试连接一个使用Http服务的基本Angular2应用程序。(我看到的大多数教程都是通过让
组件
使用
Http
服务来实现这一点的,除非瘦控制器的基本原理发生了变化,否则这似乎是错误的,但这是一个不同的问题。)

我想创建一个使用Angular的
Http
服务的服务。但是我不知道如何注入
Http
服务,除了这个:

boot.ts:

import {bootstrap} from 'angular2/platform/browser';
import {AppComponent} from './app.component';
import {HTTP_PROVIDERS } from 'angular2/http';

bootstrap(AppComponent, [HTTP_PROVIDERS]);
myService.ts:

import {Injectable} from 'angular2/core';
import {Http} from 'angular2/http';

@Injectable()
export class aService{
    constructor(http:Http){
    }
    /** do some stuff *//
}

这是可行的,但是要求服务的用户知道服务的依赖项并将它们注入引导过程似乎是非常错误的。似乎应该有一种方法可以直接将
提供者
数组传递给服务,就像你可以传递组件一样,但我找不到它。我只是错过了什么吗?

更新

这样,如果父注入器为
OtherService
提供实现,则使用此注入器,否则使用
otherserviceinpl
(默认)

@Injectable()
类服务{
其他服务;
某些维修(喷油器){
_其他=喷油器.getOptional(其他服务);
如果(_other==null){
_其他=injector.resolveAndCreateChild([
提供(OtherService,useClass:OtherServiceImpl)
]).获得(其他服务);
}
_其他。doSomething();
}
}
如果您提供另一个类似的

bootstrap(AppElement[
提供(OtherService,useClass:OtherServiceImpl2)
]);
使用了其他ServiceImpl2

另见

原创

您只需将
http
服务设置为可选(使用
@optional()
注释),如果没有提供,只需在构造函数中使用
new http()
创建一个实例即可。 通过这种方式,用户不需要了解服务依赖关系,但可以在必要时通过替代实现(例如测试)。 如果在服务内部创建依赖关系需要DI本身,则可以注入注入器并使用它获取依赖关系。 另请参见中的可选依赖项

同样有效的方法(我自己还没有试过)是创建一个儿童注射器,并指示它跳过自我

SkipSelfMetadata
文档

类依赖关系{
}
@可注射()
阶级需要独立性{
附属国;
构造函数(@SkipSelf()依赖项:依赖项){
依赖性=依赖性;
}
}
var parent=Injector.resolveAndCreate([Dependency]);
var child=parent.resolveAndCreateChild([needsdependence]);
expect(child.get(needsdependence).dependency的依赖实例).toBe(true);
var inj=Injector.resolveAndCreate([Dependency,NeedsDependency]);
expect(()=>inj.get(needsdependence)).tothrower();

我还不知道如果父级不能提供所请求的类型,是否仍然可以从“self”解析

“除非精简控制器的基本理念已经改变”——事实并非如此。引用该指南:“组件的工作是启用用户体验,仅此而已。它在视图…和应用程序逻辑之间进行调解…它将所有非琐碎的事务委托给服务。”谢谢@MarkRajcok-我认为应该这样做。我的困惑来自这样一个事实:文档显示控制器所做的远远不止这些。(例如:)如果组件被认为是非常精简的,它们可能不会经常处理http,但文档暗示这是正常的。那么,API文档中的示例不太可能遵循构建应用程序的最佳实践,这可能是合理的。我认为自己调用
new
来创建依赖关系是不受欢迎的。你是对的。如果实例化的类有依赖项,这甚至不起作用。对于完全工作的示例,需要创建子注入器,并从该子注入器获取实例。我会更新这个例子,一个很好的例子。它看起来像是1.x中的一个基本问题,比如有一个可重用的服务堆(aka模块)仍然无法在beta0中以简单的方式解决。谢谢@GünterZöchbauer——这很有帮助,讨论也是如此。