Angular. Фабрика сервисов
У меня есть три сервиса. Два сервиса выполняют определённый похожий функционал и у обоих есть некое поле value, а третий сервис в зависимости от поступающего значения должен выбирать определённый сервис из двух.
@Injectable({providedIn: "root"})
export class ServiceController {
service: FirstService | SecondService;
isNeedSecondService: boolean = true;
constructor(private firstService: FirstService , private secondService: SecondService) {
if (this.needSecondService) {
this.service = this.secondService;
} else {
this.service = this.firstService;
}
}
}
Вопрос состоит в том как мне изменить ServiceController и заинжектить нужный сервис в компоненте, чтобы я мог обращаться к value, как this.service.value?
@Component({
selector: "app-root",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AppComponent {
constructor (private service: ServiceController) {
}
}
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Заведите базовый абстрактный класс для сервисов. Допустим
abstract class BaseService {
public value: any;
}
И наследуйте от него ваши сервисы:
class FirstService extends BaseService {}
...
class SecondService extends BaseService {}
Далее немного измените ServiceController:
class ServiceController {
private service?: BaseService;
constructor(private first: FirstService, private second: SevondService) {
this.setFirstService(true);
}
// текущий сервис меняется в зависимости от параметра value
public setFirstService(value: boolean): void {
this.service = value ? this.first : this.second;
}
}
Этот архитектурный шаблон называется Стратегия