Фасадный модуль. undefined Фасадный модуль.

Фасадный модуль.

Open in new window

Фасадный модуль.

При наличии большого количества сервисов мы сталкиваемся с рядом проблем.

Проблема с наименованиями классов сервисов, они могут пересекаться.

Проблемы тестирования и замена сервисов на фейковые.

Проблема при изменениее местоположения файла сервиса.

Фасадный модуль помогает решить эти проблемы и устранить жесткую связь подсистемы сервисов с клиентскими компонентами, их использующие.

facade

С фасадным модулем мы имеем возможность:

  • изменять место положение файлов импортируемых классов;

  • без боли переименовывать и подменять классы;

  • проводить дополнительные операции при получении сервисов.

  • удобно тестировать сервисы.

Пример простого фасадно модуля facade.ts.

export { LoginService } from './service/login.service';

Мы просто експортируем нужный класс и далее везде где нужно его использовать импортируем через фасад.

import { LoginService } from '../../facade';

Этот подход решает только одну проблему с изменением местонахождения файла класса сервиса.

Реализация фасада при помощи сервиса.

import { LoginService } from './service/login.service';
import { Injector, Injectable } from '@angular/core';
@Injectable()
export class FacadeService {

  private _loginService: LoginService;
  public get loginService(): LoginService {
    if(!this._loginService){
      this._loginService = this.injector.get(LoginService);
    }
    return this._loginService;
  }

  constructor(private injector: Injector) {  }

}

Использование инъектора this.injector.get(LoginService); гарантирует правильное создание объекта сервиса.

Включение в корневой модуль.

import { FacadeService } from './facade';

...

 providers: [...FacadeService],

Использование фасадного сервиса.

import { FacadeService } from '../../facade';

...

constructor(public _facadeService: FacadeService) { }

...

  login(){
    this._facadeService.loginService.login({'username': this.user.username, 'password': this.user.password});
  }

Other topics