{"_id":"@arhiptsev/dependency-injection","_rev":"5-7a5685f0d5b276706f42511e07de319d","time":{"created":"2021-09-07T12:46:31.441Z","0.1.0":"2021-09-07T12:46:31.810Z","modified":"2022-04-04T15:24:55.519Z"},"name":"@arhiptsev/dependency-injection","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@arhiptsev/dependency-injection","version":"0.1.0","description":"Dependency Injection package for Type Script apps","author":{"name":"https://github.com/arhiptsev"},"license":"ISC","main":"./lib/index.js","types":"./lib/index.d.ts","scripts":{"build":"tsc","dev":"ts-node ./src/index.ts","test":"jest"},"dependencies":{"typescript":"^4.4.2","reflect-metadata":"^0.1.13"},"devDependencies":{"ts-node":"^10.2.1","eslint":"^7.32.0","eslint-config-airbnb-typescript":"^14.0.0","eslint-config-prettier":"^8.3.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.24.2","eslint-plugin-jest":"^24.4.0","eslint-plugin-prettier":"^4.0.0","@types/jest":"^27.0.1","@typescript-eslint/eslint-plugin":"^4.30.0","@typescript-eslint/parser":"^4.30.0","jest":"^27.1.0","ts-jest":"^27.0.5"},"gitHead":"f2900a476a78ee6590c73fcd387d8a0ad46be7ae","_id":"@arhiptsev/dependency-injection@0.1.0","_nodeVersion":"14.16.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-uRIKdIWEDYFcKVdGeDZKByzdVhMbCjW+qt49WGQMjUFfgZ9MTqxsYXZ+pbHaIR4n+9/5lX6bARR9ZUtYFpwemQ==","shasum":"92f99a60f31bda82cadc8182f4385b597c925ca8","tarball":"https://registry.npmjs.org/@arhiptsev/dependency-injection/-/dependency-injection-0.1.0.tgz","fileCount":20,"unpackedSize":19903,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhN18nCRA9TVsSAnZWagAAy9IP/1riyVK1S717S468MkhO\nDMNvFVwi1t/yiyEe+1fDMyGJpuFY+8p/9UP0Zj+gkMTUh2MdRDUMVmtfaWv0\nuQvZQwFikBQ/IfPJ/sCsKzodHEGHUx+gKkYeItZhHeXY2rWPAKCEPg2I1mMn\nFPJTEswR3sPfZdCex/SOC6Eh/llKXBHe/6VpvmSORhrwDXZRPaIJ39y9KuZY\ne8ZCONRkyRmLWM+ZrVIz2u2lSrdjBs3ImMorwDbgrqXMsHtNuyaYzQLeOJU2\nN/JkQ/GZ2umF+zUO8JJAFIN1o4EhOLRIGdcxlFbpHtY9Cll/QWBsSaG4valZ\naEc9FWo38M6pryW0FT5dA3PMHEmn//W4YDfZHE5+ilUCnHct8O6qrbja4nvd\nUhEork+UI/4BAkaicYhNRdszUNBIPUfvFNE/w1d95Ao12PfKGkrrF3ejl4kC\njRRpOlizS2Reh1BnBUzMBknlax3QJuZ/wrl2XNkkWVTWx2x3D2HQvvXh1TUw\n0E7dlkfFCOno0x7VekuF2TBYtVxw3yPlGNUMf+pptW/0yEzsKxisRf3iCXWa\nB8CjznTNBzo0quRdU1xbR1M07yWh1zphXgRiS6OoXTfv2LVsF4K/LyIkxC/r\nyINW4hewLf24IE+hPaA7Yj8Fyl3cQa/CpZwtXYYtk5DjXI95rs6D/xbvIIen\n4GKr\r\n=E5OL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFu3meFuWmXzIB3VgGcD2UxCCSupHcewteCifGff/MWKAiEAyd/ktqAkiZ8iqeS+z9RBkQXFPgMDiW1e+AxoCOGLbzo="}]},"_npmUser":{"name":"arhiptsev","email":"a.arhiptsev@gmail.com"},"directories":{},"maintainers":[{"name":"arhiptsev","email":"a.arhiptsev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dependency-injection_0.1.0_1631018791481_0.6889956745644332"},"_hasShrinkwrap":false}},"maintainers":[{"name":"arhiptsev","email":"a.arhiptsev@gmail.com"}],"description":"Dependency Injection package for Type Script apps","author":{"name":"https://github.com/arhiptsev"},"license":"ISC","readme":"### Механизм инжектирования зависимостей для TypeScript приложений\n\nИдея данной либы позаимствована из Angular, и ощутимо упрощена. \n\nПоддерживаются два основных типа зависимотей\n\n1. Инстанцируемые - классы, инстансы которых будут созданы при инжектировании (один раз, либо при каждом инжектировании если указан singleton: false)\n2. Не инстанцируемые - ими могут являться любые типы данных. \n\nВсе зависимости регистрируются в IoC контейнере, и доступны в его пределах, включая сам инстанс контейнера из которого так же можно вытащить любую зависимость. \n\nДля инжектирования зависимостей в конструктор без без явного указания токена через декоратор Inject, к классу должен быть применен декоратор Injectable, в таком случае для инстанцируемой зависимости достаточно будет указать класс в качестве ее типа.\n\nПослед создания контейнера требуется зарегистрировать зависимости (провайдеры) с помощью метода provideDependency, который принимает три типа провайдеров. \n    \n    @Injectable()\n    class ClassDependency {}\n    \n    @Injectable()\n    class TestClass {\n      constructor(\n          public dependency: ClassDependency\n        ) {}\n    }\n\n    const container = new Container();\n    container.provideDependencies([ClassDependency, TestClass]);\n\n    const testClassInstance = container.getDependency<TestClass>(TestClass);\n\n    expect(testClassInstance.dependency).toBeInstanceOf(ClassDependency);\n\nДля каждой зависимости требуется инжектирующий токен, под которым она будет зарегистрирована и доступна для инжектирования. В случае передачи провайдера как функции (класса), в качестве токена и зависимости будет использован сам класс. Так же мы можем передать обьект, в котором можно отдельно указать токен, зависимость и если это класс, указать должен ли он быть синглтоном. \n\n    const INJECTION_TOKEN = Symbol();\n    \n    @Injectable()\n    class ClassDependency {}\n\n    @Injectable()\n    class TestClass {\n      constructor(\n        @Inject(INJECTION_TOKEN) public dependency: ClassDependency\n      ) {}\n    }\n\n    const container = new Container();\n    container.provideDependencies([\n      { token: INJECTION_TOKEN, useClass: ClassDependency },\n      TestClass,\n    ]);\n\n    const testClassInstance = container.getDependency<TestClass>(TestClass);\n\n    expect(testClassInstance.dependency).toBeInstanceOf(ClassDependency);\n\nПример провайдинга и инжектирования не синглтонных зависимостей:\n\n    const INJECTION_TOKEN = Symbol();\n    \n    @Injectable()\n    class ClassDependency {}\n\n    @Injectable()\n    class TestClass {\n      constructor(\n        @Inject(INJECTION_TOKEN) public dependency1: ClassDependency,\n        @Inject(INJECTION_TOKEN) public dependency2: ClassDependency,\n      ) {}\n    }\n\n    const container = new Container();\n    container.provideDependencies([\n      { token: INJECTION_TOKEN, useClass: ClassDependency, singleton: false },\n      TestClass,\n    ]);\n\n    const testClassInstance = container.getDependency<TestClass>(TestClass);\n\n    expect(testClassInstance.dependency1).not.toBe(\n      testClassInstance.dependency2\n    );\n  \n  Пример провайдинга и инжектирования произвольных типов данных, в провайдере передается функция возвращаемое значение которой, будет заинжектировано: \n  \n    const INJECTION_TOKEN = Symbol();\n\n    @Injectable()\n    class TestClass {\n      constructor(@Inject(INJECTION_TOKEN) public dependency: string) {}\n    }\n\n    const container = new Container();\n    container.provideDependencies([\n      {\n        token: INJECTION_TOKEN,\n        useValue: () => \"test string\",\n        singleton: false,\n      },\n      TestClass,\n    ]);\n\n    const testClassInstance = container.getDependency<TestClass>(TestClass);\n\n    expect(testClassInstance.dependency).toBe(\"test string\");\n  \n  \n","readmeFilename":"README.md"}