解决angular依赖注入的弱依赖实现解耦

解决angular依赖注入的弱依赖实现解耦

在angular的官方hero的demo中依赖注入的使用为

import { Component } from '@angular/core';
import { ProjectService } from './services/project.service';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'weak-depend';
  constructor(public projectSer: ProjectService) {

  }
}

public projectSer: ProjectService 表明依赖注入的具体类
这样有一个缺点,当封装一个module时需要provider一个service,而这个service是外部的一个service,比如我现在这项目下有一个页面我需要知道这个项目详细相关信息,如果不解耦,必要在这个module中引入这个ProjectService,就形成了强依赖关系,违背设计原则。
有时我们的module是用loadchildren引入的参数传递很不方便,所以要解决外部依赖问题。

解决办法

如: 新建一个other的module,在other下的component需要依赖projectService,但是却只是需要部分属性
所以

import { Component, OnInit, Inject } from '@angular/core';
interface IProjectService {
  projectId: number
}
@Component({
  selector: 'app-other',
  templateUrl: './other.component.html',
  styleUrls: ['./other.component.css']
})
export class OtherComponent implements OnInit {

  constructor(@Inject('ProjectService') public  projectSer: IProjectService) { }

  ngOnInit() {
    console.log(this.projectSer)
  }

}

用inject来注入,用一个interface来定义类型,这样可与真实的ProjectService解耦

provide这个类

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { ProjectService } from './services/project.service';
import { OtherModule } from './other/other.module';
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    OtherModule
  ],
  providers: [
    ProjectService,
    {
      provide: 'ProjectService',
      useExisting: ProjectService
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

因为在真实项目中ProjectService可能早就注入了,所以用useExisting

向模块中导入配置类Service

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    OtherModule
  ],
  providers: [
    ProjectService,
    {
      provide: 'ProjectService',
      useExisting: ProjectService
    },
    {
        provide: 'ConfigService',
        useValue: {
            name: 'zengwe'
        }
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

在需要的地方用@Inject注入就行

总结

灵活的用好
{provide:‘string’, useExisting: className}
{provide:‘string’, useClass: className}
{provide:‘string’, useValue: value}
{provide:‘string’, useFactory: Factory}
即可解决强依赖问题

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值