今天我遇到了一些我认为不会给我带来麻烦的事情。在Java和Spring中,我可以声明两个实现给定接口的bean,而在它们被注入的另一个类中,我只使用接口;这实际上是我喜欢控制反转的原因:你不需要真正知道你正在处理什么对象,只需要知道它的种类。因此,在我小小的Angular2/Typescript程序中,我也想做同样的事情:webapp.module.ts:
我原本期望这个组件会被正确的服务注入,即使参数只明确定义了接口。当然,我收到了一个错误信息(“错误:无法解析HeroesService的所有参数”)。
现在,我并不指望有一个简单的解决方案,因为这听起来像是一种架构上的缺陷。但也许有人可以指出一个替代设计?
...
import { WebAppConfigurationService } from './app/services/webapp.configuration.service';
@NgModule({
...
providers: [WebAppConfigurationService]
})
export class AppModule { }
tnsapp.module.ts:
...
import { TnsConfigurationService } from './services/tns.configuration.service';
@NgModule({
...
providers: [TnsConfigurationService]
})
export class AppModule { }
这两个模块使用不同的提供程序:TnsConfigurationService
或WebAppConfigurationService
。
然而,这两个@Injectable
服务实现了相同的接口:
configuration.interface:
export interface IConfigurationService {
...
}
最后,在我的一个组件中,我使用了我在开始时向你展示的这些模块之一提供的可注入对象:
import { IConfigurationService } from './configuration.interface';
export class HeroesService {
constructor(private configurationService: IConfigurationService) { }
}
我原本期望这个组件会被正确的服务注入,即使参数只明确定义了接口。当然,我收到了一个错误信息(“错误:无法解析HeroesService的所有参数”)。
现在,我并不指望有一个简单的解决方案,因为这听起来像是一种架构上的缺陷。但也许有人可以指出一个替代设计?