user_of_toster
@user_of_toster

Как делать DI, не нарушая DIP?

Есть класс, в конструктор которого помимо пары аргументов, должны впрыскиваться зависимости. Проблема в том, что при каждом создании экземпляра этого класса впрыскивать зависимости неудобно. Решение сводится к использованию IoC.

Проблема в том, что если использовать фреймворки по типу InversifyJS, то вся кодовая база обрастает зависимостями от фреймворка, в итоге в попытке избавится от одной зависимости, мы получаем другую.

Можно отдельно создавать index.js, в котором хранится класс с уже injected зависимостями, но в итоге количество файлов увеличивается вдвое.

Интересно, как эта проблема решается на практике, особенно в крупных проектах. Как вы впрыскиваете зависимости? Закрываете ли вы глаза на зависимость от фреймворка и используете их? Или создаете отдельно index.js, в котором храните класс с уже injected зависимостью?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
bingo347
@bingo347
Ткнуть в доку лучше готового к копипасте ответа
По SOLID вполне будет так:
// SomeInterface.ts
export interface SomeInterface {
    /* ... */
}

// DependencyClass.ts
import type {SomeInterface} from './SomeInterface';

export class DependencyClass implements SomeInterface {
    /* ... */
}

// DependableClass.ts
import type {SomeInterface} from './SomeInterface';

export class DependableClass {
    constructor(
        private dependency: SomeInterface,
    ) {}

    /* ... */
}


// index.ts
import {DependencyClass} from './DependencyClass';
import {DependableClass} from './DependableClass';

new DependableClass(
    new DependencyClass(),
);

Как уже написал Demian Smith в комментах к вопросу, большинство существующих контейнеров typescript не хранят информацию о типах, а следовательно заинжектить через них можно что угодно и typescript поверит, что это нужный тип, а ошибки уйдут в рантайм. (Надеюсь на этих длинных выходных найти время выкинуть свой контейнер на npm, правда он не чисто ООП, я его проектировал, чтоб использовать в любой парадигме)

Так же советую почитать дядю Боба: https://www.litres.ru/robert-s-martin/chistaya-arh...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы