【问题标题】:Calling injected services from class instances从类实例调用注入服务
【发布时间】:2016-11-09 14:35:22
【问题描述】:

我正在编写一个 Angular2 应用程序。考虑一个我实例化了许多实例的类 Cat,它有一个 API 方法来写出自己:

class Cat {
  constructor(private name: string) { }

  public write() {
    Api.write(this);   // <== how do I do this?
  }
}

Cat#write 方法需要访问包裹在Http 周围的 API 服务:

@Injectable()
class Api {
  constructor(private http: Http) { }
  write(data) {
    this.http.post(...);
  }
}

我遇到的(也许很简单)问题是如何从我的Cat 类中访问API#write。由于我需要 Cat 构造函数来传递名称,因此我不能将其用于注入。那么如何使API#write 可用呢?有什么方法可以访问Api 的单例实例吗?在那种情况下,谁来负责实例化单例实例?

我使用了一个静态 API 类,但这显然不起作用,因为注入是在实例中,而不是静态类中。

我在这里缺少什么基本的设计模式?

【问题讨论】:

    标签: dependency-injection angular


    【解决方案1】:

    我也为此苦苦挣扎了一段时间。我确实想出了某种解决方案,但感觉很老套。

    我使用单例 AppInjector 实例。它只设置一次,在AppComponent(引导组件)的constructor 中。它用于解决要创建的对象的依赖关系。

    这个 AppInjector 看起来像这样:

    export class AppInjector {
    
        private static _INJECTOR: Injector;
    
        public static set INSTANCE(injector: Injector) {
            if (!this._INJECTOR) {
                this._INJECTOR = injector;
            }
        }
    
        public static get INSTANCE() : Injector {
            return this._INJECTOR;
        }
    }
    

    AppComponent 的构造函数如下所示:

    constructor(injector: Injector) {
        AppInjector.INSTANCE = injector;
    }
    

    现在,如果您在应用程序的 bootstrap 函数中添加了您的 Api

    bootstrap(AppComponent, [Api]);
    

    您将能够从 Cat 实例中获取此单例,如下所示:

    class Cat {
    
      public get _api() : Api {
         return AppInjector.INSTANCE.get(Api);
      }
    
      constructor(private name: string) { }
    
      public write() {
        this._api.write(this);
      }
    }
    

    再一次,这绝不是正确的解决方案,并且可能违反了 Angular2 中的许多准则,但我理解您的问题,并且还想要一个比这更好的解决方案,但它现在可以正常工作,我可以愉快地继续编码了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 2017-04-16
      • 2021-02-04
      • 2021-12-16
      • 2016-01-03
      相关资源
      最近更新 更多