Angular:我可以在其模块范围内使用私有服务吗?

时间:2018-11-16 18:21:30

标签: angular

在angular 5应用程序中,我有一个模块负责分配特定的数据。此服务注入两个服务-如果找到,则从localStorage检索数据,如果找不到,则另一个向服务器请求相同的数据。我希望此模块在不公开实际进行检索的服务的情况下公开检索到的数据,但是我遇到了问题。

DataService:

@Injectable()
export class DataService {
  constructor(private httpService: HttpService,
              private storageService: LocalStorageService) { }

  get = (): Observable<User> => {
    const data: string = this.storageService.fetch();
    if (data) {
      return Observable.of(JSON.parse(data));
    }
    return this.httpService
      .get();
  };
}

HttpService:

@Injectable()
export class HttpService {

  private dataUrl = 'api/endpoint';
  constructor(private http: HttpClient,
              private storageService: LocalStorageService) {}
  get = () => {
    return this.http
      .get(this.dataUrl)
      .map((retrieved: any) => {
        this.storageService.store(retrieved);
        return retrieved;
      }).catch(() => Observable.throw(err));
  };
}

LocalStorageService:

@Injectable()
export class LocalStorageService {

  private key = 'dataKey';

  constructor() { }

  fetch = (): string => {
    return localStorage.getItem(this.key); 
  };

  store(d: any): void  {
    localStorage.setItem(this.key, JSON.stringify(d));
  };
}

我尝试通过仅暴露DataService来定义模块:

@NgModule({
  imports: [
    CommonModule
  ],
  providers: [
    DataService
  ]
})
export class DataModule {}

结果是StaticInjectorError[HttpService]: NullInjectorError: No provider for HttpService!"LocalStorageService都出现了类似的错误,都被app.module抛出。

我可以通过重新定义NgModule提供程序声明以包括应保留为私有的注入服务来使应用程序正常工作:

@NgModule({
  imports: [
    CommonModule
  ],
  providers: [
    DataService,
    LocalStorageService,
    HttpService
  ]
})
export class DataModule {}

但是,这会将那些服务暴露给任何导入DataModule的模块,这正是我要避免的。有没有一种方法可以使@Injectable可以在模块内进行依赖项注入而不必将其添加到providers并将其暴露在模块外?

1 个答案:

答案 0 :(得分:0)

如果您不想通过Module公开,则可以在组件级别提供HttpService。请注意,在组件处提供服务将在您提供组件的任何地方为每个组件创建新实例。

提供语法与模块语法

 providers: [
    DataService,
    LocalStorageService,
    HttpService
  ]