4

我试图在 Redux 的帮助下消除组件对 Angular 服务的依赖。

基本上,流程是组件 -> 操作 -> 服务

在服务中我要使用@angular/core的http模块,建议在构造函数中传入:

export class SampleService {
    constructor(public http: Http) {}
}

当我从操作中调用服务时,它不会获取 http 提供程序,因为我没有 http 提供程序的实例。

export default class SampleAction {
    private _projectService;
    constructor() {
        this._sampleService = new SampleService();
    }
}

如何将 http 提供程序注入服务?

4

3 回答 3

2

在您的操作中,您可以在构造函数中注入 Http 并将其传递给服务实例。就像是

export default class SampleAction {
    private _projectService;
    constructor(@Inject(Http) http: Http) {
        this._sampleService = new SampleService(http);
    }    
}
于 2016-02-15T15:43:11.860 回答
0

事实上,您不需要自己实例化服务。只需将服务注入组件或其他服务。重要的是为此执行流程配置提供程序。在您的情况下, Http (以及更普遍的HTTP_PROVIDERS)和SampleSampleService. 提供程序是为整个应用程序(在引导级别)或组件(providers属性)定义的。

bootstrap(AppComponent, [ HTTP_PROVIDERS, SampleService ]);

或者

@Component({
  providers: [ HTTP_PROVIDERS, SampleService ]
})
export class SomeComponent {
  constructor(private action: SampleAction) {
  }

  executeAction() {
    this.action.doSomething();
  }
}

这是您应该为您的SampleAction课程使用的代码:

export default class SampleAction {
  constructor(private _projectService: SampleService) {
  }
}

您可以注意到,为了能够注入到服务中,@Injectable需要使用。

@Injectable()
export class SampleService {
  constructor(public http: Http) {}
}

这个答案可以为您提供有关使用依赖注入的方式以及分层注入器如何在 Angular2 中工作的更多提示:

于 2016-02-15T13:47:41.170 回答
0

不要使用new SomeService().

相反,只需将类添加到bootstrap(.., [Providers])应该是应该共享服务实例的范围的根的提供者或组件中。

还将所有依赖项(构造函数参数)添加到提供程序列表中。

如果一切设置正确,则在构造函数参数请求实例的任何地方,都会传入一个具有所有依赖项自动解析的实例。

只需配置 DI 并让它为您完成工作。

于 2016-02-15T13:48:48.037 回答