【问题标题】:DI with cyclic dependency with custom HTTP and ConfigService具有自定义 HTTP 和 ConfigService 的循环依赖的 DI
【发布时间】:2017-04-13 02:43:58
【问题描述】:

我正在尝试实现一个 ConfigService 来检索项目中正确环境的正确配置。我目前遇到循环依赖

(index):28 Error: (SystemJS) Provider parse errors:
    Cannot instantiate cyclic dependency! Http: in NgModule AppModule
    Error: Provider parse errors:

在我看来,我已经探索了代码并且存在问题:

自定义Http

constructor(backend: XHRBackend, options: RequestOptions, public spinnerService: SpinnerService, public exceptionService: ExceptionService, public configService: ConfigService) 

异常服务

constructor(private _notificationService: NotificationService, private _spinnerService: SpinnerService, private _configService: ConfigService, private _router: Router)

配置服务

constructor(private http: Http) {}

如您所见,我在此图中显示了一个循环依赖项(没有任何好的约定):

我现在的问题是,如何解决?我听说过Injector,但我不确定我是否真的可以在这种情况下使用它。

提前感谢您的回答。

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    DI 无法解析循环依赖。一种解决方法是注入注入器并强制获取实例:

    @Injectable()
    class ConfigService {
      private http: Http;
      constructor(injector:Injector) {
        setTimeout(() => this.http = injector.get(Http);
      }
    }
    

    【讨论】:

    • Angular 4 是否有另一种方法?
    • 那是 Angular 2 - 4
    • 我同时希望对此有所改进。
    • 没有改变这一点的计划。这需要改变构造函数在 TypeScript 中的工作方式,而没有人希望它们被改变。不要指望这里会发生变化。
    • 因为new ConfigService()需要返回,然后injector.get(Http)才能创建一个依赖ConfigServiceHttp实例。 ConfigService 的构造函数中间injector.get(Http) 无法获得实例。 setTimeout() 允许完成构造函数,并且仅在稍后请求 Http 类。这个setTimeout 是真正打破循环的东西,其他的只是样板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多