Comments (9)
Hi @hiendaovinh
Please check examples: https://github.com/samber/do/blob/master/examples/interface/main.go
from do.
Well, I don't think the example works exactly like the proverbs.
The provider returns interface: https://github.com/samber/do/blob/master/examples/interface/car.go#L18
from do.
Can you write a quick demo of the API you expect?
from do.
Hi, what I am expecting is that
type carImplem struct {
Engine Engine
Wheels []*Wheel
}
func (c *carImplem) Start() {
println("vroooom")
}
// Provide a concrete type
// at main.go
do.Provide(injector, &carImplem{
Engine: engine,
Wheels: wheels,
})
// A thousand years later
// at my-service.go
type Car interface {
Start()
}
car := do.MustInvoke[Car](injector)
I tried to follow https://github.com/golang/go/wiki/CodeReviewComments#interfaces although I understand that with do's generic resolving, it's currently impossible.
from do.
Why not using do.ProvideNamed
and do.InvokeNamed ?
from do.
It won't work either because of the type hinting.
E.g. I will provide/resolve named wheels
func NewWheel() *Wheel {
return &Wheel{}
}
// main.go
do.ProvideNamedValue(injector, "wheel-1", NewWheel())
do.ProvideNamedValue(injector, "wheel-2", NewWheel())
do.ProvideNamedValue(injector, "wheel-3", NewWheel())
do.ProvideNamedValue(injector, "wheel-4", NewWheel())
// car.go
type IWheel interface {}
wheels := []IWheel{
do.MustInvokeNamed[IWheel](i, "wheel-1"),
do.MustInvokeNamed[IWheel](i, "wheel-2"),
do.MustInvokeNamed[IWheel](i, "wheel-3"),
do.MustInvokeNamed[IWheel](i, "wheel-4"),
}
Output:
panic: DI: could not find service `wheel-1`, available services: `*main.Car`, `*main.Engine`, `wheel-1`, `wheel-2`, `wheel-3`, `wheel-4`
from do.
It doesn't depend on the invokers, it depends on the provider. Unlike Java or PHP, Go interfaces generally belong in the package that uses values of the interface type. Which means that the provider will return implementation while the consumer will specify their expected interface.
from do.
I'd be also happy to be able to invoke services by interfaces. We could have something like do.MustInvokeBy
which accepts an interface as a type parameter, goes through all registered services and returns the first which implements the given interface. WDYT?
I know it will be slower than MustInvoke
or MustInvokeNamed
, but I believe it's quiet ok if it's not called regularly and registered service list is not so long
The implementation could look somewhat like
func InvokeBy[T any](i *Injector) (res T, e error) {
_i := getInjectorOrDefault(i)
e = fmt.Errorf("not found")
_i.forEach(func(name string, service any) {
if v, ok := service.(T); ok {
res = v
e = nil
}
})
return
}
func MustInvokeBy[T any](i *Injector) T {
s, err := InvokeBy[T](i)
must(err)
return s
}
from do.
Hi there,
I made a proposal in do@v2 -> #45
do.As[*carImplem, Car](injector)
// or
do.InvokeAs[Car](injector)
from do.
Related Issues (20)
- v2: Feature Request - expose a method for add lifecycle hook HOT 2
- How can I InvokeNamed T to any HOT 7
- V2 Feature Request: add lifecycle interface support HOT 2
- feat: InjectorOpts.HookBeforePanic HOT 2
- Performance Question about service instnace : getInstance(i Injector) (T, error) HOT 1
- Proposal: way to automate invoke deps in do.Provider for any type constructor HOT 2
- `OverrideTransient` is implemented with `OverrideNamed` instead of `OverrideNamedTransient` in v2.0.0-beta.5 HOT 1
- Expose a method for adding/removing lifecycle hooks at runtime
- Transform hooks into slices of hooks HOT 1
- Add hook at the scope level
- More hooks
- Add telemetry, OTEL, logger... HOT 1
- `InvokeAs` problems HOT 5
- V2: Bug in parallel shutdown HOT 3
- Add toy examples in Go playground sandboxes
- Service register best practices HOT 5
- Need better handling for arrays
- Add TypeMismatch instead NotFound invoke error HOT 1
- Support `interface` in `As`/`InvokeAs` HOT 1
- Proposal: allow service providers registered in the root scope to be invoked with values and other providers in the scoped injector HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from do.