di
A (very) WIP Go 1.18+ generic dependency injection package based on type reflection. Because this package is in a very early development state, you need to expect breaking API changes.
Usage
Below, you can see a very simplified demonstration on how this package works. If you want to see a more comprehensive example, please take a look at the examples listed.
type Service1 interface {}
type Service2 interface {}
type service1Impl struct {
S2 Service2
}
type service2Impl struct {
S1 Service1
}
func main() {
c := di.NewContainer()
di.MustRegister[Service1, service1Impl](c)
di.MustRegister[Service2, service2Impl](c)
s1 := di.MustGet[Service1](c)
}
Limitations
There are some severe limitations with this package.
- To set fields automatically via the injection system, they must be exported. All unexported fields are ignored.
- Currently, only interface fields can be automatically assigned to instances of registered services.
- Currently, there are only singleton instances because of simplicity.
Ideas
Here, you can see some implementation ideas which will be implemented in the upcoming time into this package.
- Register dependencies directly via instance
- Register dependencies via builder functions
- Add disposal functions which will be called when the container is getting disposed.
- Add transistent service registration.
Goal
The goal of this package is to replace the current DI system in my project shinpuru which currently depends on suralabs/di.