{"id":13800795,"url":"https://github.com/shepherdwind/egg-di","last_synced_at":"2025-05-13T00:21:03.320Z","repository":{"id":44839702,"uuid":"125005831","full_name":"shepherdwind/egg-di","owner":"shepherdwind","description":"Dependency injection lib for Egg.js.","archived":false,"fork":false,"pushed_at":"2020-09-29T09:15:04.000Z","size":16,"stargazers_count":50,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-15T08:48:43.736Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shepherdwind.png","metadata":{"files":{"readme":"README.md","changelog":"History.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-13T06:53:00.000Z","updated_at":"2025-03-03T03:04:02.000Z","dependencies_parsed_at":"2022-08-28T04:24:01.660Z","dependency_job_id":null,"html_url":"https://github.com/shepherdwind/egg-di","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdwind%2Fegg-di","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdwind%2Fegg-di/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdwind%2Fegg-di/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shepherdwind%2Fegg-di/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shepherdwind","download_url":"https://codeload.github.com/shepherdwind/egg-di/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253843975,"owners_count":21972987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-04T00:01:16.344Z","updated_at":"2025-05-13T00:21:03.301Z","avatar_url":"https://github.com/shepherdwind.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## egg-di\n\n[![build status][travis-image]][travis-url]\n[![Test coverage][coveralls-image]][coveralls-url]\n[![NPM version][npm-image]][npm-url]\n[![npm download][download-image]][download-url]\n\n[npm-image]: http://img.shields.io/npm/v/egg-di.svg?style=flat-square\n[npm-url]: http://npmjs.org/package/egg-di\n[download-image]: https://img.shields.io/npm/dm/egg-di.svg?style=flat-square\n[download-url]: https://npmjs.org/package/egg-di\n[travis-image]: https://img.shields.io/travis/shepherdwind/egg-di.svg?style=flat-square\n[travis-url]: https://travis-ci.org/shepherdwind/egg-di\n[coveralls-image]: https://img.shields.io/coveralls/shepherdwind/egg-di.svg?style=flat-square\n[coveralls-url]: https://coveralls.io/r/shepherdwind/egg-di?branch=master\n\nDependency injection lib for [Egg.js](https://eggjs.org/).\n\n### use\n\n```typescript\n// service\nimport { Context } from 'egg-di';\n@Context\nexport class HackerNews extends Service {\n  foo() { }\n}\n\n// other service\nimport { inject } from 'egg-di';\nexport class Foo extends Service {\n  @inject()\n  private readonly hackerNews: HackerNews;\n\n  bar() {\n    this.hackerNews.foo();\n  }\n}\n\n// other controller\nimport { inject } from 'egg-di';\nexport class Foo extends Controller {\n  @inject()\n  private readonly hackerNews: HackerNews;\n\n  bar() {\n    this.hackerNews.foo();\n  }\n}\n```\n\n### circular dependency\n\n```typescript\n// Foo\nexport default class Foo {\n  @inject(() =\u003e Bar) readonly bar: Bar;\n}\n\n// Bar\nexport default class Bar {\n  @inject(() =\u003e Foo) readonly foo: Foo;\n}\n```\n\n### test\n\nTest injected service.\n\n```typescript\n// service\nimport { Context } from 'egg-di';\n@Context\nexport class HackerNews extends Service {\n  foo() { }\n}\n\n// hackernews.test.ts\nimport { getComponent } from 'egg-di';\ndescribe('service/HackerNews.test.js', () =\u003e {\n  const app = mm.app();\n  let ctx: Context;\n  let hackerNews: HackerNews;\n\n  before(async () =\u003e {\n    await app.ready();\n    ctx = app.mockContext();\n    hackerNews = getComponent(HackerNews, ctx);\n  });\n\n  it('getTopStories', async () =\u003e {\n    const list = await hackerNews.getTopStories();\n    assert(list.length === 30);\n  });\n});\n```\n\nMock injected service.\n\n```typescript\n// service\nimport { Context } from 'egg-di';\n@Context\nexport class HackerNews extends Service {\n  foo() { }\n}\n\n// bar.test.ts\nimport { getComponent } from 'egg-di';\nconst app = mm.app();\nctx = app.mockContext();\nconst hackerNews: HackerNews = getComponent(HackerNews, ctx);\nmm.data(hackerNews, 'foo', 'hello');\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshepherdwind%2Fegg-di","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshepherdwind%2Fegg-di","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshepherdwind%2Fegg-di/lists"}