我们希望在面向对象的解决方案中依靠接口而不是具体的方法,但是,当您将服务注入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中的依赖项反转原理,但是由于它是在模块级别提供的,因此无论如何应该非常具体,这增加了复杂性。真的有帮助吗?
答案 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 }
]
})