gpt4 book ai didi

dependency-injection - 只能通过bootstrap向服务中注入(inject)服务吗?

转载 作者:太空狗 更新时间:2023-10-29 17:15:17 28 4
gpt4 key购买 nike

我正在尝试连接一个使用 Http 服务的基本 Angular2 应用程序。 (我看到的大多数教程都是通过让 Component 使用 Http 服务来实现的,这似乎是错误的,除非瘦 Controller 的基本理念已经改变——但这是一个不同的问题。)

我想创建一个使用 Angular 的 Http 服务的服务。但除此之外,我不知道如何注入(inject) Http 服务:

boot.ts:

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

bootstrap(AppComponent, [HTTP_PROVIDERS]);

我的服务.ts:

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

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

这行得通,但是要求服务的用户知道服务的依赖项并将它们注入(inject)到 Bootstrap 过程中似乎是非常错误的。似乎应该有一种方法可以像处理组件一样将 providers 数组直接传递给服务,但我找不到它。我只是错过了什么吗?

最佳答案

更新

这样,如果父注入(inject)器为 OtherService 提供了一个实现,则使用此实现,否则使用 OtherServiceImpl(默认)。

@Injectable()
class SomeService {
OtherService _other;

SomeService(Injector injector) {
_other = injector.getOptional(OtherService);
if (_other == null) {
_other = injector.resolveAndCreateChild([
provide(OtherService, useClass: OtherServiceImpl)
]).get(OtherService);
}
_other.doSomething();
}
}

如果你提供另一个像

bootstrap(AppElement, [
provide(OtherService, useClass: OtherServiceImpl2)
]);

OtherServiceImpl2 被使用。

另见 https://github.com/angular/angular/issues/5622

原创

您可以将 http 服务设为可选(使用 @Optional() 注释),如果未提供,则只需在构造函数中使用 创建一个实例新的 Http()。这样用户就不需要了解服务依赖性,但可以在必要时通过替代实现(例如测试)。如果在服务内部创建依赖项需要 DI 本身,您可以注入(inject)一个注入(inject)器并使用它来获取依赖项。另请参阅 http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html 中的可选依赖项

还有什么可行的(我自己还没有尝试过)只是创建一个子注入(inject)器并指示它跳过 self

来自SkipSelfMetadata 文档

  class Dependency {
}

@Injectable()
class NeedsDependency {
dependency;
constructor(@SkipSelf() dependency:Dependency) {
this.dependency = dependency;
}
}

var parent = Injector.resolveAndCreate([Dependency]);
var child = parent.resolveAndCreateChild([NeedsDependency]);
expect(child.get(NeedsDependency).dependency instanceof Depedency).toBe(true);

var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]);
expect(() => inj.get(NeedsDependency)).toThrowError();

如果父级不能提供请求的类型,我还不知道这是否仍然从“ self ”解决。

关于dependency-injection - 只能通过bootstrap向服务中注入(inject)服务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34581564/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com