尝试在Angular应用中进行依赖关系反转是一个好主意吗?

时间:2019-04-09 15:10:01

标签: angular dependency-injection

我们希望在面向对象的解决方案中依靠接口而不是具体的方法,但是,当您将服务注入Angular组件时,通常会使用具体的方法,因为编译后该应用程序只是JavaScript,而javascript中没有接口。 / p>

我刚刚看到了一些可以解决此问题的代码,如下所示:

export const serviceProvider = new InjectionToken<CustomTypeCreatedUsingGenericsForComposition>('CustomTypeCreatedUsingGenericsForComposition');

,然后在模块提供程序中:

{
  provide: CustomTypeCreatedUsingGenericsForComposition,
  useClass: AnInstance,
}

,然后在组件中:

  constructor(
    @Inject(ResidentialKeysListBLLProvider)
    private residentialKeysListBLL: ResidentialKeysListBLL
) {}

现在,实现与DI分离,并且要更改服务,请更改useClass。令牌实际上就像是包装器一样,可以直接将接口用作DI参数。

这似乎很棒,因为我们已经基本实现了SOLID中的依赖项反转原理,但是由于它是在模块级别提供的,因此无论如何应该非常具体,这增加了复杂性。真的有帮助吗?

1 个答案:

答案 0 :(得分:0)

您可以使用InjectionToken,但我认为有更好的解决方案。

您不能在Angular DI中注入接口,但是您可以注入抽象类

示例

简单的界面:

export interface IVehicleService {
    doSomething(param1: string; param2: string);
}

简单的抽象类:

export abstract class VehicleService implements IVehicleService {
    abstract doSomething(param1: string; param2: string);
}

具体课程:

@Injectable()
export class MazdaVehicleService extends VehicleService {
    doSomething(param1: string; param2: string) {...}
}

DI规则:

@NgModule({
    providers: [
       { provide: VehicleService, useClass: MazdaVehicleService }
    ]
})