无法在angular4中注入依赖注入

时间:2018-11-29 15:08:32

标签: angular angular-dependency-injection

我有一个如下的班级

import { Injectable, Inject } from '@angular/core';

@Injectable()
export class moviindustry {
    constructor(private music:musicindustry) { }
    producer() {
        this.music.album();     
        alert('moviindustry producer');
    }
    directort() {
        alert('moviindustry directort');
    }
    crew() {
        alert('moviindustry crew');
    }
}


export class musicindustry {
    album() {
        alert('album')
    }
}

我已经像这样在NgModule中注册了该类

@NgModule({
  declarations: [
    AppComponent,
    ComponentAComponent
  ],
  imports: [
    BrowserModule,
    HttpModule
  ],
  providers: [  
    moviindustry,
    musicindustry
  ],  
  bootstrap: [AppComponent]
})
export class AppModule { }

现在当我尝试访问此类的课程

export class AppComponent {   
  constructor(private movies:moviindustry){
    this.movies.producer();    
  }
}

我遇到以下错误

  

未捕获的错误:无法解析moviindustry的所有参数:(?)。       在语法错误(compiler.es5.js:1694)

根据文档,Injectable()用于为该类注入依赖项注入,那么为什么我不能使用它?具有讽刺意味的是,当我在构造函数中使用http时,我的应用会被编译,有人可以帮助我理解这一点吗?

注意:

我也不能这样使用

constructor(@Inject(musicindustry) private music:musicindustry) { }

2 个答案:

答案 0 :(得分:3)

您的代码存在严重问题。根据{{​​3}}完全不是。

它违反了许多规则,例如单一责任主体服务类的名称应在UpperCamelCase等中。

在这里,您可以适当地重构代码以使其正常工作:

为这两个服务创建两个不同的文件:

电影服务:

import { Injectable } from '@angular/core';
import { MusicService } from './music.service';

@Injectable()
export class MovieService {

  constructor(private music: MusicService) { }

  producer() {
    this.music.album();
    alert('moviindustry producer');
  }

  directort() {
    alert('moviindustry directort');
  }

  crew() {
    alert('moviindustry crew');
  }

}

音乐服务:

import { Injectable } from '@angular/core';

@Injectable()
export class MusicService {

  album() {
    alert('album')
  }

}

这是您推荐的Angular Style Guide

答案 1 :(得分:1)

musicindustry类移到moviindustry类之上,以便更好地解决moviindustry类的依赖关系。同样,即使没有DI的情况下,也最好为提供者添加@Injectable()装饰器。

import { Injectable, Inject } from '@angular/core';

@Injectable()
export class musicindustry {
    album() {
        alert('album')
    }
}

@Injectable()
export class moviindustry {
    constructor(private music:musicindustry) { }
    producer() {
        this.music.album();     
        alert('moviindustry producer');
    }
    directort() {
        alert('moviindustry directort');
    }
    crew() {
        alert('moviindustry crew');
    }
}