V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
roy2220
V2EX  ›  分享创造

又一个依赖注入的实现(Go)

  •  
  •   roy2220 · 2020-06-07 23:58:42 +08:00 · 2169 次点击
    这是一个创建于 1660 天前的主题,其中的信息可能已经有所发展或是发生改变。

    go 依赖注入实现的不少,主要的有:

    wire 的实现是代码生成的方式,每次修改都要重新 go generate,不太方便,还是运行时反射方便一些。

    uber 的 dig 和 facebook 的 inject 是基于运行时反射的实现,使用方式上有些区别,但这两个用起来都不太直观。

    我心中“理想”的样子:

    Foo {
      A int `export:"x"` // 声明导出 x
    }
    func (Foo) SetUp() { Foo.A = 1 } // 这里手动设置 A,在 SetUp 返回后自动导出 x=Foo.A
    
    
    Bar {
      B int `export:"y"` // 声明导出 b
    }
    func (Bar) SetUp() { Bar.B = 2 } // 这里手动设置 B,在 SetUp 返回后自动导出 y=Bar.B
    
    
    Baz {
      A int `import:"x"` // 声明导入 x
      B int `import:"y"` // 声明导入 y
      C int `export:"z"` // 声明导出 z
    }
    func (Baz) SetUp() { Baz.C = Baz.A + Baz.B } // SetUp 被调用时,保证 x 、y 的值已被自动导入,即 Baz.A=x Baz.B=y 。接着是手动计算 C 的值( z=x+y ),SetUp 返回后自动导出 z=Baz.C 。
    
    
    Qux {
      C int `import:"z"` // 声明导入 z
    }
    func (Qux) SetUp() { println(Qux.C) } // 同理 SetUp 被调用时,z 的值已被自动导入到 C,打印输出 Qux.C 的值为 3 。
    
    1. 库要做的事情就是分析 import 、export 的依赖关系,有没有循环引用之类的,并在恰当的时机拷贝 export 的值到 import 、在恰当的时机调用结构体的 SetUp 方法等。

    2. 应当提供一种拦截机制:值被 export 后,到真正传递到 import 的期间,可以安插一些 filter,对值进行操作或修改,并且这些 filter 可以设置优先级。这样方便实现各种灵活的定制。

    目前上述的点都已经实现,代码提交在:

    https://github.com/roy2220/depinj

    思绪有点混乱,看不懂我在写啥没关系😂,github 上有 example,有兴趣跑一跑就明白了。。。欢迎讨论交流

    my3157
        1
    my3157  
       2020-06-08 19:41:52 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2370 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:04 · PVG 00:04 · LAX 08:04 · JFK 11:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.