go-kod / kod

A generics based dependency injection application framework for Go, support OpenTelemetry trace/metric/log natively 🚀🚀🚀
https://pkg.go.dev/github.com/go-kod/kod
Apache License 2.0
109 stars 3 forks source link

Failed to get a member of a ref instance that it was a member of a ref instance? #171

Closed leopku closed 4 weeks ago

leopku commented 4 weeks ago

See https://github.com/leopku/kodtest/blob/b2389ba401a69b0343de2ca89d1e2c85dcc0f031/cmd/demo2.go#L43

type demo2Impl struct {
    kod.Implements[Demo2]
    kod.LazyInit
    migrate kod.Ref[migrate.IMigrate]
}

...

    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("demo2 called")
        err := kod.Run(context.Background(), func(ctx context.Context, ins *app) error {
            // pp.Println(ins.demo2.Get())
            demo2Ins := ins.demo2.Get()
            demo2Ins.migrate.Get().Hello()  <-- this line
            return nil
        }, kod.WithOpenTelemetryDisabled())
        cobra.CheckErr(err)
    },
demo2Ins.migrate undefined (type Demo2 has no field or method migrate, but does have Migrate)
sysulq commented 4 weeks ago

ins.demo2.Get() returns interface migrate.IMigrate, so we cannot get migrate directly. You should call migrate object in Migrate() function, like what I commited.