{"id":22407998,"url":"https://github.com/sjqzhang/gdi","last_synced_at":"2025-07-31T19:31:56.280Z","repository":{"id":43231670,"uuid":"391006347","full_name":"sjqzhang/gdi","owner":"sjqzhang","description":"Go Dependency injection through `init`(IOC),极简的go依赖注入工具包。","archived":false,"fork":false,"pushed_at":"2023-11-03T09:44:00.000Z","size":194,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-06-21T19:58:38.787Z","etag":null,"topics":["dependency-injection","di","dig","go","ioc","wire"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sjqzhang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-30T09:23:44.000Z","updated_at":"2023-09-05T13:56:30.000Z","dependencies_parsed_at":"2024-06-21T19:06:02.333Z","dependency_job_id":"b23acd38-7937-4921-8d07-3120d0c4fe86","html_url":"https://github.com/sjqzhang/gdi","commit_stats":null,"previous_names":[],"tags_count":36,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjqzhang%2Fgdi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjqzhang%2Fgdi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjqzhang%2Fgdi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sjqzhang%2Fgdi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sjqzhang","download_url":"https://codeload.github.com/sjqzhang/gdi/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228283720,"owners_count":17896267,"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":["dependency-injection","di","dig","go","ioc","wire"],"created_at":"2024-12-05T11:16:06.001Z","updated_at":"2024-12-05T11:16:07.092Z","avatar_url":"https://github.com/sjqzhang.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"## golang 依赖注入包(Golang Dependency Injection) 简称：GDI\n\n## 原理\n\n通过golang 的 init方法进行对象注册或自动注册对象，使用反射技术对为空的指针对象进行赋值，完成对象的组装。\n\n## 优点：\n- 零侵入\n- 免注册（自动发现与注册）\n- 零配置\n- 易排查（错误信息明确）\n- 支持多种依赖注入方式\n- 支持生成依赖图\n- 支持注解swagger路由\n- 支持注解中间件\n- 支持自动扫描指定包并注册对象\n- 支持动态获取go源码(AOP支持,具体参阅：https://github.com/sjqzhang/gdi_aop)\n\n## 注意事项\n\n- 注册对象必须写在init方法中(或在main中调用`gdi.GenGDIRegisterFile(false)`自动生成注册依赖,注意需要进行二次编译)\n- 对象的类型必须是指针类型(接口类型除外)\n- 最后一定要调用 gdi.Init() 方法\n- 只支持单例实例，且只按类型进行反射注入\n- 只能能过指针参数获取对象\n- 构建后的对可以直接进行类型转换,参阅示例\n\n## 注册对象的几种方式\n\n```golang\n    gdi.GenGDIRegisterFile(false) //全自动注册（推荐）\n\tgdi.Register(\n\t\t\u0026AA{},//直接实例化对象（方式一）\n\t\t\u0026BB{},\n\t\tfunc() *DD {//使用函数实例化对象，返回对象的指针（方式二）\n\t\t\treturn \u0026DD{}\n\t\t},\n        func() (*CC,error) {//使用函数实例化对象，返回对象的指针，入创建对象是否出错（方式三）\n        return \u0026CC{},nil\n        },\n        func() (*EE,string) {//使用函数实例化对象，返回对象的指针及名称，后面可以使用名称进行注入，参考自带例子（方式四）\n        return \u0026EE{},\"ee\"\n        },\n\t) //可以一次注册多个对象\n\n```\n\n## 如何安装\n\n`go get -u github.com/sjqzhang/gdi`\n\n## 使用示例\n\n```golang\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/sjqzhang/gdi\"\n)\n\ntype AA struct {\n\tB *BB\n\tA *string `inject:\"name:hello\"`\n}\n\ntype BB struct {\n\tD *DD\n\tC *CC\n}\n\ntype CC struct {\n\tName string\n\tAge  int\n}\n\ntype DD struct {\n\tC *CC\n\tI IIer `inject:\"name:ii\"` //注意当为接口时，这里不能是指针，且有多实现时，目前只能返回第一个实现\n\tE *EE\n}\n\ntype EE struct {\n\tA *AA //`inject:\"name:a\" json:\"a\"`\n\t*FF\n}\n\ntype FF struct {\n\tAddr string\n\tT *TT `inject:\"name:ttt\"`\n\tHello *string  `inject:\"name:hello\"`\n}\n\ntype TT struct {\n\tHl string\n}\n\ntype IIer interface {\n\tAdd(a, b int) int\n}\n\ntype II struct {\n\tA string `inject:\"name:hello\"`\n\tHome string `inject:\"name:home\"`\n}\n\nfunc (ii *II) Add(a, b int) int {\n\tfmt.Println(\"ii.a-\u003e\",ii.A)\n\tfmt.Println(\"ii.home-\u003e\",ii.Home)\n\treturn a + b\n}\n\nfunc (d *DD) Say(hi string) string {\n\n\tfmt.Println(hi + \", welcome\")\n\n\treturn hi\n\n}\n\nfunc (d *DD) Add(a, b int) int { //注意：当有多个实现时，存在不确定因索\n\n\treturn a - b\n\n}\n\nfunc init() {\n\n\tgdi.Register(\n\t\t\u0026AA{},\n\t\t\u0026BB{},\n\t\tfunc() *DD {\n\t\t\treturn \u0026DD{}\n\t\t},\n\t) //可以一次注册多个对象\n\t//gdi.Register(\u0026BB{})\n\t//gdi.Register(\u0026DD{})\n\t//gdi.Register(\u0026CC{})\n\tgdi.Register(func() (*II,string){\n\t\treturn \u0026II{\n\n\t\t},\"ii\"\n\t}) //简单对象\n\t//gdi.Register(\u0026FF{\n\t//\tAddr: \"SZ\",\n\t//}) //简单对象\n\n\tgdi.Register(func() *CC { //复杂对象\n\n\t\tage := func() int { //可进行复杂构造，这只是示例\n\t\t\treturn 10 + 4\n\t\t}\n\t\treturn \u0026CC{\n\t\t\tName: \"hello world\",\n\t\t\tAge:  age(),\n\t\t}\n\t})\n\n\tgdi.Register(func() (*EE, error) { //带错误的注册\n\n\t\treturn \u0026EE{}, nil\n\t})\n\n\tgdi.Register(func() (*TT,string) {\n\n\t\treturn \u0026TT{\n\t\t\tHl: \"aaaa\",\n\t\t},\"ttt\"\n\t})\n\n\tgdi.Register(func() (*string,string) {\n\n\t\tvar name string\n\t\tname=\"xsdasdfaf\"\n\t\treturn \u0026name,\"hello\"\n\t})\n\n}\n\nfunc main() {\n\tgdi.Debug(true)      //显示注入信息，方便排错，需在gdi.Init()方法之前调用\n\tgdi.Init()           //使用前必须先调用，当出现无解注入对象时会panic,避免运行时出现空指针\n\tvar a *AA\n\ta = gdi.Get(a).(*AA) //说明，这里可以直接进行类型转换，不会出现空指针，当出现空指针时，gdi.Init()就会panic\n\tfmt.Println(a.B.C.Name)\n\tfmt.Println(a.B.D.C.Age)\n\tfmt.Println(a.B.D.Say(\"zhangsan\"))\n\tfmt.Println(a.B.D.I.Add(2, 3))\n\tfmt.Println(a.B.D.E.A.B.D.E.A.B.D.E.A.B.C.Age)\n\tfmt.Println(a.B.D.E.A.B.C.Name)\n\tfmt.Println(a.B.D.E.T.Hl)\n\tfmt.Println(*a.B.D.E.Hello)\n\tfmt.Println(*a.A)\n\n}\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjqzhang%2Fgdi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsjqzhang%2Fgdi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsjqzhang%2Fgdi/lists"}