Итак, на высоком уровне Nest, естественно, использует метаданные, отраженные из Typescript, чтобы знать, что и где связывать. Обычно эти метаданные представляют собой такие вещи, как имена классов, которые существуют во время выполнения, поэтому вы не можете использовать интерфейсы.
@Injectable()
сообщает Nest, что он должен найти метаданные, предоставленные в конструкторе этого класса, и найти правильных поставщиков. Вот как Nest выполняет большую часть DI, как упоминалось ранее.
@Inject()
говорит Nest: «Эй, я знаю, что это говорит о том, что это Logger
класс, но на самом деле вводит провайдеру токен инъекции Я говорю вам ", что полезно для таких вещей, как использование определенных c экземпляров, скажем, класса Logger.
При использовании собственного провайдера, @Injectable()
не требуется, если вы используете фабрику, так как вы показали, но это было бы, если бы вы использовали вместо этого класс, потому что фабрики возвращают экземпляр значения, которое будет предоставлено, тогда как с useClass
вы возвращаете определение класса, которое Nest должен будет создать. 1013 * Единственная причина, по которой я мог видеть, что ваше имя файла перезаписано, заключается в том, что провайдеры имеют одноэлементную область видимости между модулями, но если один и тот же провайдер находится в массиве providers
, то каждый раз это должен быть новый экземпляр, так что, возможно, что-то с этим действует немного шаткий