Dependency inject container for Go with generics
Go to file
NeonXP 5e807d63bf Обновить README.md 2024-04-28 02:48:11 +03:00
.drone.yml Изменил(а) на '.drone.yml' 2022-08-03 01:22:47 +03:00
LICENSE.md initial 2022-07-17 02:51:22 +03:00
README.md Обновить README.md 2024-04-28 02:48:11 +03:00
di.go Added get by interface method 2022-07-26 04:56:30 +03:00
di_test.go Обновление имени пакета 2024-04-28 00:18:31 +03:00
go.mod Обновление имени пакета 2024-04-28 00:18:31 +03:00

README.md

Go Dependency Inject Container

Simple dependecy inject container with generics.

Use for your own risk!

Usage

Register dependency

di.Register("service id", func () (*Service, error) { /* construct service */ })

Get dependency

Get dependencies by type:

services, err := di.GetByType[Service]()

Get dependencies by type and id:

service, err := di.Get[Service]("service id")

Get dependencies by interface:

services, err := di.GetByInterface[Worker]() // Worker is interface for many workers

Go doc

package di // import "go.neonxp.ru/di"

func Get[T any](id string) (*T, error)
func GetByInterface[Interface any]() ([]Interface, error)
func GetByType[T any]() ([]*T, error)
func Register[T any](id string, constructor func() (*T, error))

Example

di.Register("serviceA", func() (*ServiceA, error) { // <- Register service A
    return &ServiceA{}, nil
})
di.Register("serviceB", func() (*ServiceB, error) { // <- Register service B, that depends from service A
    serviceA, err := di.Get[ServiceA]() // <- Get dependency from container by type
    if err != nil {
        return nil, err
    }

    return &ServiceB{
        ServiceA: serviceA[0],
    }, nil
})

// Do work ...
service, err := di.Get[ServiceB]("serviceB") // <- Get instantinated service B
if err != nil {
    panic(err)
}

service.DoStuff() // Output: Hello, world!


// Services ...
type ServiceA struct{}

func (d *ServiceA) DoStuff() {
	fmt.Println("Hello, world!")
}

type ServiceB struct {
	ServiceA *ServiceA
}

func (d *ServiceB) DoStuff() {
	d.ServiceA.DoStuff()
}

License

GPLv3