Сторонние зависимости в DI-управляемом рабочем процессе - PullRequest
0 голосов
/ 29 февраля 2020

Я создаю простой веб-сканер в node.js, используя TypeScript и inversify.js для управления своими зависимостями. Я работаю над этим проектом, главным образом, чтобы получить лучшую оценку asp из OOP (о которой у меня не было особых знаний, я работаю в основном с внешним интерфейсом) и внедрение зависимостей. Мой вопрос об использовании сторонних зависимостей в моих классах. Как мне разделить следующий класс и ввести зависимость Cheerio, чтобы этот код следовал принципам SOLID? Этот класс предоставляет открытый метод c analyseWebsite, который:

  • принимает URL-адрес веб-сайта
  • делает запрос на этот URL-адрес для получения необработанного разметка веб-сайта
  • создает обертку Cheerio из разметки
  • , а затем использует закрытые методы, которые принимают обертку в качестве аргумента, возвращает заголовок, описание и все URL-адреса веб-сайта, которые он находит в тегах <a> в выбранном HTML.
@injectable()
export class CheerioTraverser implements MarkupTraverser {
  constructor(
      @inject(TYPES.MarkupFetcher) private fetcher: MarkupFetcher,
  ) { }

  async analyseWebsite(url: string): Promise<AnalysedWebsite> {
    const body = await this.fetcher.getMarkup(url);
    const wrapper: CheerioStatic = cheerio.load(body);
    return {
      url: url,
      title: this.getSiteTitle(wrapper),
      anchors: this.getAllAnchors(wrapper),
      description: this.getSiteDescription(wrapper),
    };
  }

  private getAllAnchors(wrapper: CheerioStatic): string[] {
    const allAnchorTags = wrapper('a');
    const allUrls = allAnchorTags.toArray().map((a) => (
      a.attribs.href
    ));
    try {
      return allUrls.filter(url => url.includes('http'));
    } catch (e) {
      return [];
    }
  }

  private getSiteTitle(wrapper: CheerioStatic): string {
    return wrapper("title").text();
  }

  private getSiteDescription(wrapper: CheerioStatic): string {
    return wrapper('meta[name="description"]').attr('content');
  }
}

Реализует следующий интерфейс:

export interface MarkupTraverser {
    analyseWebsite(url: string): Promise<AnalysedWebsite>;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...