2016-08-23 62 views
7

我目前挖掘到DI在角2.我使用的是通用的亚型混凝土的数据类型是这样实现REST客户端外:角2进样依赖构造

class RESTClient<T>{ 
    constructor() { 
     var inj = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]); 
     this.http = inj.get(Http); 
     this.conf = RESTConfiguration; 
    } 
} 
class BookClient extends RESTClient<Book>{  
    constructor(){ 
     // since I dont want to inject the HTTP Providers here, I'm using a custom injector in the super class 
     super(); 
    } 
} 

class WriterClient extends RESTClient<Writer>{  
    ... 
    ... 
} 

所以,按照我的理解,有将是由超类REST服务注入的所有RESTClient之间共享的一个http服务。

现在我想有一个RESTConfiguration类这样:

@Injectable() 
export class RESTConfiguration { 
    get baseURL() { 
    return this._baseURL; 
    } 

    set baseURL(value) { 
     alert("sets value to"+value); 
     this._baseURL = value; 
    } 

    private _baseURL; 

} 

应该在主应用程序被配置为这样:

initializeApp(){ 
    this.restconf.baseURL = "http://localhost:3004/"; 
} 
bootstrap(MyApp, [RESTConfiguration]).then(); 

我现在想知道如何注入一个单我的RESTConfiguration实例放入RESTService类中,而不将它传递给我想保持无参数的构造函数,以减少代码重复并避免使用typescript中泛型的问题。

在上面的例子中(第一个代码片段)我试图使用我创建的ReflectiveInjector注入我的配置,它为我提供了一个自定义配置实例。

我想到了几个解决方案:

  1. 获取访问应用程序“全球喷油器”使用服务或一些静态类属性

  2. 实施额外的单逻辑为使一个可用的我配置

  3. 寻找在构造函数外部使用角度本地注入方法的方法?

在我的思维中是否存在错误或者我滥用了DI框架?

+0

看起来像一个dup http://stackoverflow.com/questions/39038791/inheritance-and-dependency-injection/39038814?noredirect = 1#comment65548939_39038814 –

+0

在阅读上面的链接问题之后,我非常感受作者 - 我倾向于使用他的“脏黑客”来通过全局注入器 - 我绝对不想在〜 20-30课。任何方式来解决这个问题?如何使用自定义注入器如上所示?然后,我可以直接将配置附加到我的服务中,或者只是将其设置为一个简单的静态类... – hakkurishian

+0

这会创建一个独立的注入器。此自定义注入器不会返回任何模块中注册的提供者以及为这些提供者创建的实例。您可以按照链接问题的答案来做 - 将您的Angular2应用程序的注入器传递给周围,并从该注入器获取服务。 –

回答

7

这应该为这个问题提供解决方案,但也有助于在任何情况下需要注入服务而不提供它作为构造参数。

我看到这个答案在另一篇文章: Storing injector instance for use in components

你可以配置你的AppModule类的角度喷油器,然后在其他类中使用它(你可以从任何类访问的AppModule的成员)。

在的AppModule补充:

export class AppModule { 
    /** 
    * Allows for retrieving singletons using `AppModule.injector.get(MyService)` 
    * This is good to prevent injecting the service as constructor parameter. 
    */ 
    static injector: Injector; 
    constructor(injector: Injector) { 
     AppModule.injector = injector; 
    } 
} 

然后在您的其他类,你可以做以下的(对于这个问题,替换以http为MyService):

@Injectable() 
export class MyClass{ 
    private myService; 

    constructor(){ 
     this.myService = AppModule.injector.get(MyService); 
    } 
} 

这将是等效采用:

constructor(private myService: MyService){} 
+0

它的作品! 在我的情况:从另一个模块获取服务(不是懒惰),所有解决实例! 谢谢你。 – 1antares1