Size: a a a

2020 March 27

AM

Andrey Melikhov in Node.js SPb
Injectable как раз палит какие у тебя зависимости в конструкторе
источник

NM

Nikolay Matvienko in Node.js SPb
++
источник

AM

Andrey Melikhov in Node.js SPb
потому если хочется чисто — нужно принять, что Services неста — это Application Services и не смешивать их с Domain Services
источник

AM

Andrey Melikhov in Node.js SPb
но опять же — это может быть жутким переусложнением на большинстве проектов, абстракции ради чистоты )
источник

AM

Andrey Melikhov in Node.js SPb
задача архитектора — соблюдать баланс
источник

NM

Nikolay Matvienko in Node.js SPb
именно, нужно понимать ценность и профит в рамках требований.
источник

AV

Alexey Vykhrystyuk in Node.js SPb
Alexey Vykhrystyuk
а получится ли писать бизнес логику с использованием инфраструктуры nestjs (DI не ручками) но без проникания ее в код?
например если вместо интерфейсов и токенов будем принимать в ctor abstract class

cats-repository.ts:

export class CatsRepository extends AbstractCatsRepository {
 constructor(connection: AbstractConnection) {}
}


app.module.ts:

@Module({
 providers: [
   CatsRepository,
   {
     provide: AbstractConnection,
     useValue: ConcreteConnection,
   }
 ],
})
export class AppModule {}


примерно так мы пишем код на C# только у нас есть interfaces (в runtime) всесто abstract classes
в общем пока код выше не работает в nestjs (без `@Injectable`) нету смысла заморачиваться с abstract class
источник

AM

Andrey Melikhov in Node.js SPb
Ну и даже если пишешь не чисто — понимать риски, не делать это бездумно.
источник

AM

Andrey Melikhov in Node.js SPb
Alexey Vykhrystyuk
в общем пока код выше не работает в nestjs (без `@Injectable`) нету смысла заморачиваться с abstract class
это другое
источник

AM

Andrey Melikhov in Node.js SPb
хотя да, если мы считаем, что слой один то и абстракции не нужны )
источник

AV

Alexey Vykhrystyuk in Node.js SPb
+
источник

AV

Alexey Vykhrystyuk in Node.js SPb
идеи были:
- добиться чистоты и не зависимости от nestjs
- писать меньше ручного создания объектов за счет DI nest’a

но nestjs проникает в логику (`@Injectable`) - не круто
источник

AV

Alexey Vykhrystyuk in Node.js SPb
Andrey Melikhov
чтобы IoC мог построить дерево провайдеров
чисто теоритически обычно все сервиса пишутся в спец. секцию providers в @Module
providers: [CatsRepository],

то есть nestjs о сервисах знает и он бы мог сам их конструкторы проверить (какие там зависимости), но видимо не все так просто.
Видимо обязательно декоратор нужен чтоб метаданные из ts получить по конструктору
источник

AM

Andrey Melikhov in Node.js SPb
Да, анализатор бежит по декораторам
источник

AV

Alexey Vykhrystyuk in Node.js SPb
хм а если так (наполовину руками)?
cats-service.ts:

export class CatsService {
 constructor(repository: ICatsRepository) {}
}


app.module.ts:

@Module({
 providers: [
   { provide: ‘ICatsRepository’, useFactory: () => new CatsRepository() },
   {
     provide: ‘CatsService’,
     useFactory: (repository: ICatsRepository) => new CatsService(repository),
     inject: [‘ICatsRepository’],
   }
 ],
})
export class AppModule {}


в таком подходе нам не нужна метадата, т.к. мы сами делаем new T() (но только в конфигурации DI !)
а за нас весь граф зависимостей сам резолвится будет
Но тут еще все можно ошибиться с порядком аргументов в inject (ts не чекает), возможно это честная плата за использования общего DI фрейморка и в тоже время отвязанную бизнес логику от него

P.S: Вместо строк можно использовать что-то другое например так (или Symbol ) :
{ provide: CatsRepository, useFactory: () => new CatsRepository() },
источник

AV

Alexey Vykhrystyuk in Node.js SPb
не стесняйтесь вбросить кто что думает
источник

с

сomorsiс in Node.js SPb
А в чём ещё раз минус зависимости от @injectable?
источник

с

сomorsiс in Node.js SPb
сomorsiс
А в чём ещё раз минус зависимости от @injectable?
Если вопрос в замене фреймворка на другой - можно завернуть его в свой декоратор
источник

AM

Andrey Melikhov in Node.js SPb
сomorsiс
А в чём ещё раз минус зависимости от @injectable?
У тебя проникает фреймворк со всей его логикой работы с зависимостями. И в тесты ты тоже тянешь фреймворк
источник

с

сomorsiс in Node.js SPb
Andrey Melikhov
У тебя проникает фреймворк со всей его логикой работы с зависимостями. И в тесты ты тоже тянешь фреймворк
Но декоратор вроде только добавляет метадату и все?
источник