Documentation
¶
Index ¶
- func NewContainer() *container
- func NewParamContainer() *paramContainer
- type DecoratorContext
- type Dependency
- type Service
- func (s *Service) AppendCall(method string, deps ...Dependency) *Service
- func (s *Service) AppendWither(method string, deps ...Dependency) *Service
- func (s *Service) ScopeContextual() *Service
- func (s *Service) ScopeDefault() *Service
- func (s *Service) ScopePrivate() *Service
- func (s *Service) ScopeShared() *Service
- func (s *Service) SetConstructor(fn interface{}, deps ...Dependency) *Service
- func (s *Service) SetField(field string, dep Dependency) *Service
- func (s *Service) SetValue(v interface{}) *Service
- func (s *Service) Tag(tag string, priority int) *Service
- type SuperContainer
- func (c SuperContainer) AddDecorator(tag string, decorator interface{}, deps ...Dependency)
- func (c SuperContainer) CircularDeps() error
- func (c SuperContainer) CopyServiceTo(id string, dst interface{}) (err error)
- func (c SuperContainer) Get(id string) (result interface{}, err error)
- func (p SuperContainer) GetParam(id string) (result interface{}, err error)
- func (c SuperContainer) GetTaggedBy(tag string) (result []interface{}, err error)
- func (c SuperContainer) IsTaggedBy(id string, tag string) bool
- func (p SuperContainer) OverrideParam(id string, d Dependency)
- func (c SuperContainer) OverrideService(id string, s Service)
Examples ¶
- NewContainer (CircularDependency)
- NewContainer (CopyServiceToError)
- NewContainer (CopyServiceToOK)
- NewContainer (Decorator)
- NewContainer (ErrorFieldDoesNotExist)
- NewContainer (ErrorServiceDoesNotExist)
- NewContainer (GetTaggedBy)
- NewContainer (InvalidConstructorParameters)
- NewContainer (ScopePrivate)
- NewContainer (ScopeShared)
- NewContainer (Setter)
- NewContainer (Simple)
- NewContainer (Wither)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewContainer ¶
func NewContainer() *container
Example (CircularDependency) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Spouse struct {
Name string
Spouse *Spouse
}
func main() {
wife := container.NewService()
wife.SetConstructor(func() *Spouse {
return &Spouse{}
})
wife.SetField("Name", container.NewDependencyValue("Mary Jane"))
wife.SetField("Spouse", container.NewDependencyService("husband"))
husband := container.NewService()
husband.SetConstructor(func() *Spouse {
return &Spouse{}
})
husband.SetField("Name", container.NewDependencyValue("Peter Parker"))
husband.SetField("Spouse", container.NewDependencyService("wife"))
c := container.NewContainer()
c.OverrideService("wife", wife)
c.OverrideService("husband", husband)
_, err := c.Get("wife")
fmt.Println(err)
}
Output: container.get("wife"): circular dependencies: @husband -> @wife -> @husband
Example (CopyServiceToError) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Person struct {
Name string
}
func (p *Person) SetName(n string) {
p.Name = n
}
func (p Person) WithName(n string) Person {
p.Name = n
return p
}
type People struct {
People []Person
}
func main() {
p := container.NewService()
p.SetValue(Person{})
p.SetField("Name", container.NewDependencyValue("Mary Jane"))
c := container.NewContainer()
c.OverrideService("mary", p)
var mary People
err := c.CopyServiceTo("mary", &mary)
fmt.Println(err)
}
Output: container.CopyServiceTo("mary"): reflect.Set: value of type container_test.Person is not assignable to type container_test.People
Example (CopyServiceToOK) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Person struct {
Name string
}
func (p *Person) SetName(n string) {
p.Name = n
}
func (p Person) WithName(n string) Person {
p.Name = n
return p
}
func main() {
p := container.NewService()
p.SetValue(Person{})
p.SetField("Name", container.NewDependencyValue("Mary Jane"))
c := container.NewContainer()
c.OverrideService("mary", p)
var mary Person
_ = c.CopyServiceTo("mary", &mary)
fmt.Println(mary)
}
Output: {Mary Jane}
Example (Decorator) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Greeter interface {
Greet() string
}
type greeter struct{}
func (g greeter) Greet() string {
return "How are you?"
}
type politeGreeter struct {
parent Greeter
}
func (p politeGreeter) Greet() string {
return fmt.Sprintf("Hello! %s", p.parent.Greet())
}
func PoliteGreeterDecorator(ctx container.DecoratorContext) politeGreeter {
return politeGreeter{
parent: ctx.Service.(greeter),
}
}
func main() {
g := container.NewService()
g.SetValue(greeter{})
g.Tag("greeter-tag", 0)
c := container.NewContainer()
c.OverrideService("greeter", g)
c.AddDecorator("greeter-tag", PoliteGreeterDecorator)
var greeterObj Greeter
_ = c.CopyServiceTo("greeter", &greeterObj)
fmt.Println(greeterObj.Greet())
}
Output: Hello! How are you?
Example (ErrorFieldDoesNotExist) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Person struct {
Name string
}
func (p *Person) SetName(n string) {
p.Name = n
}
func (p Person) WithName(n string) Person {
p.Name = n
return p
}
func main() {
mary := container.NewService()
mary.SetConstructor(func() Person {
return Person{}
})
// it's an invalid field name, it cannot work!
mary.SetField("FullName", container.NewDependencyValue("Mary Jane"))
c := container.NewContainer()
c.OverrideService("mary", mary)
_, err := c.Get("mary")
fmt.Println(err)
}
Output: container.get("mary"): set field "FullName": set `*interface {}`."FullName": field `FullName` does not exist
Example (ErrorServiceDoesNotExist) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Person struct {
Name string
}
func (p *Person) SetName(n string) {
p.Name = n
}
func (p Person) WithName(n string) Person {
p.Name = n
return p
}
func main() {
mary := container.NewService()
mary.SetConstructor(func() Person {
return Person{}
})
mary.SetField("Name", container.NewDependencyValue("Mary Jane"))
c := container.NewContainer()
// oops... we forgot to add the variable `mary` to the container
// c.OverrideService("mary", mary)
_, err := c.Get("mary")
fmt.Println(err)
}
Output: container.get("mary"): service does not exist
Example (GetTaggedBy) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Person struct {
Name string
}
func (p *Person) SetName(n string) {
p.Name = n
}
func (p Person) WithName(n string) Person {
p.Name = n
return p
}
func main() {
p1 := container.NewService()
p1.SetValue(Person{})
p1.SetField("Name", container.NewDependencyValue("person1"))
p1.Tag("person", 0) // priority 0
p2 := container.NewService()
p2.SetValue(Person{})
p2.SetField("Name", container.NewDependencyValue("person2"))
p2.Tag("person", 1) // priority 1
p3 := container.NewService()
p3.SetValue(Person{})
p3.SetField("Name", container.NewDependencyValue("person3"))
p3.Tag("person", 2) // priority 2
c := container.NewContainer()
c.OverrideService("p1", p1)
c.OverrideService("p2", p2)
c.OverrideService("p3", p3)
// it returns all services tagged by "person", sorted by the tag priority
people, _ := c.GetTaggedBy("person")
fmt.Println(people)
}
Output: [{person3} {person2} {person1}]
Example (InvalidConstructorParameters) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Server struct {
Host string
Port int
}
func NewServer(host string, port int) *Server {
return &Server{Host: host, Port: port}
}
func main() {
s := container.NewService()
// invalid arguments
s.SetConstructor(
NewServer,
container.NewDependencyValue(nil), // it should be a string!
container.NewDependencyValue("localhost"), // it should be an int!
)
c := container.NewContainer()
c.OverrideService("server", s)
_, err := c.Get("server")
fmt.Println(err)
}
Output: container.get("server"): constructor: arg0: cannot cast `<nil>` to `string` container.get("server"): constructor: arg1: cannot cast `string` to `int`
Example (ScopePrivate) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
func main() {
i := 0
num := container.NewService()
num.SetConstructor(func() int {
i++
return i
})
num.ScopePrivate()
c := container.NewContainer()
c.OverrideService("number", num)
first, _ := c.Get("number")
second, _ := c.Get("number")
// first is not equal to second, because the scope is private
fmt.Println(first, second)
}
Output: 1 2
Example (Setter) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Person struct {
Name string
}
func (p *Person) SetName(n string) {
p.Name = n
}
func (p Person) WithName(n string) Person {
p.Name = n
return p
}
func main() {
mary := container.NewService()
mary.SetConstructor(func() *Person { // we have to use a pointer, because we use a setter
return &Person{}
})
mary.AppendCall("SetName", container.NewDependencyValue("Mary Jane"))
c := container.NewContainer()
c.OverrideService("mary", mary)
maryObject, _ := c.Get("mary")
fmt.Println(maryObject)
}
Output: &{Mary Jane}
Example (Simple) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Person struct {
Name string
}
func (p *Person) SetName(n string) {
p.Name = n
}
func (p Person) WithName(n string) Person {
p.Name = n
return p
}
type People struct {
People []Person
}
func main() {
// create Mary Jane
mary := container.NewService()
mary.SetConstructor(func() Person {
return Person{}
})
mary.SetField("Name", container.NewDependencyValue("Mary Jane"))
mary.Tag("person", 1) // priority = 1, ladies first :)
// create Peter Parker
peter := container.NewService()
peter.SetConstructor(func() Person {
return Person{}
})
peter.SetField("Name", container.NewDependencyProvider(func() string {
return "Peter Parker"
}))
peter.Tag("person", 0)
// create "people"
people := container.NewService()
people.SetValue(People{}) // instead of providing a constructor, we can provide a value directly
people.SetField("People", container.NewDependencyTag("person")) // fetch all objects tagged as "person", and assign them to the field "people"
// create a container, and append all services there
c := container.NewContainer()
c.OverrideService("mary", mary)
c.OverrideService("peter", peter)
c.OverrideService("people", people)
// instead of these 2 following lines,
// you can write:
//
// peopleObject, _ := c.Get("people")
var peopleObject People
_ = c.CopyServiceTo("people", &peopleObject)
fmt.Printf("%+v\n", peopleObject)
}
Output: {People:[{Name:Mary Jane} {Name:Peter Parker}]}
Example (Wither) ¶
package main
import (
"fmt"
"github.com/gomponents/gontainer-helpers/container"
)
type Person struct {
Name string
}
func (p *Person) SetName(n string) {
p.Name = n
}
func (p Person) WithName(n string) Person {
p.Name = n
return p
}
func main() {
mary := container.NewService()
mary.SetConstructor(func() Person {
return Person{}
})
mary.AppendWither("WithName", container.NewDependencyValue("Mary Jane"))
c := container.NewContainer()
c.OverrideService("mary", mary)
maryObject, _ := c.Get("mary")
fmt.Println(maryObject)
}
Output: {Mary Jane}
func NewParamContainer ¶
func NewParamContainer() *paramContainer
Types ¶
type DecoratorContext ¶
type Dependency ¶
type Dependency struct {
// contains filtered or unexported fields
}
func NewDependencyProvider ¶
func NewDependencyProvider(provider interface{}) Dependency
func NewDependencyService ¶
func NewDependencyService(serviceID string) Dependency
NewDependencyService creates a Dependency to the given Service
func NewDependencyTag ¶
func NewDependencyTag(tagID string) Dependency
NewDependencyTag creates a Dependency to the given tag
func NewDependencyValue ¶
func NewDependencyValue(v interface{}) Dependency
NewDependencyValue creates a nil-Dependency, it does not depend on anything in the container
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
func NewService ¶
func NewService() Service
func (*Service) AppendCall ¶
func (s *Service) AppendCall(method string, deps ...Dependency) *Service
func (*Service) AppendWither ¶
func (s *Service) AppendWither(method string, deps ...Dependency) *Service
func (*Service) ScopeContextual ¶
func (*Service) ScopeDefault ¶
func (*Service) ScopePrivate ¶
func (*Service) ScopeShared ¶
func (*Service) SetConstructor ¶
func (s *Service) SetConstructor(fn interface{}, deps ...Dependency) *Service
type SuperContainer ¶
type SuperContainer struct {
// contains filtered or unexported fields
}
func NewSuperContainer ¶
func NewSuperContainer() *SuperContainer
func (SuperContainer) AddDecorator ¶
func (c SuperContainer) AddDecorator(tag string, decorator interface{}, deps ...Dependency)
func (SuperContainer) CircularDeps ¶
func (c SuperContainer) CircularDeps() error
func (SuperContainer) CopyServiceTo ¶
CopyServiceTo gets or creates the desired service and copies it to the given pointer
var server *http.Server
container.CopyServiceTo("server", &server)
func (SuperContainer) GetTaggedBy ¶
func (SuperContainer) IsTaggedBy ¶
func (SuperContainer) OverrideParam ¶
func (p SuperContainer) OverrideParam(id string, d Dependency)
func (SuperContainer) OverrideService ¶
Source Files
¶
Click to show internal directories.
Click to hide internal directories.