golang中有更好的依赖注入模式吗?

前端之家收集整理的这篇文章主要介绍了golang中有更好的依赖注入模式吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
鉴于此代码
package main

import (
    "fmt"
)

type datstr string

type Guy interface {
   SomeDumbGuy() string
}

func (d *datstr) SomeDumbGuy() string {
  return "some guy"
}

func someConsumer(g Guy) {
  fmt.Println("Hello," + g.SomeDumbGuy())
}

func main() {
    var d datstr
    someConsumer(&d)
}

组件的连接是否以正确的方式完成,将依赖连接在一起?好像我在代码中使用了这一点.是否有比这更好的共同模式,还是我在思考它?

是的,facebookgo注入库允许您接收注入的成员并为您连接图表.

代码https://github.com/facebookgo/inject

文件https://godoc.org/github.com/facebookgo/inject

这是文档中的代码示例:

package main

import (
    "fmt"
    "net/http"
    "os"

    "github.com/facebookgo/inject"
)

// Our Awesome Application renders a message using two APIs in our fake
// world.
type HomePlanetRenderApp struct {
    // The tags below indicate to the inject library that these fields are
    // eligible for injection. They do not specify any options,and will
    // result in a singleton instance created for each of the APIs.

    NameAPI   *NameAPI   `inject:""`
    PlanetAPI *PlanetAPI `inject:""`
}

func (a *HomePlanetRenderApp) Render(id uint64) string {
    return fmt.Sprintf(
        "%s is from the planet %s.",a.NameAPI.Name(id),a.PlanetAPI.Planet(id),)
}

// Our fake Name API.
type NameAPI struct {
    // Here and below in PlanetAPI we add the tag to an interface value.
    // This value cannot automatically be created (by definition) and
    // hence must be explicitly provided to the graph.

    HTTPTransport http.RoundTripper `inject:""`
}

func (n *NameAPI) Name(id uint64) string {
    // in the real world we would use f.HTTPTransport and fetch the name
    return "Spock"
}

// Our fake Planet API.
type PlanetAPI struct {
    HTTPTransport http.RoundTripper `inject:""`
}

func (p *PlanetAPI) Planet(id uint64) string {
    // in the real world we would use f.HTTPTransport and fetch the planet
    return "Vulcan"
}

func main() {
    // Typically an application will have exactly one object graph,and
    // you will create it and use it within a main function:
    var g inject.Graph

    // We provide our graph two "seed" objects,one our empty
    // HomePlanetRenderApp instance which we're hoping to get filled out,// and second our DefaultTransport to satisfy our HTTPTransport
    // dependency. We have to provide the DefaultTransport because the
    // dependency is defined in terms of the http.RoundTripper interface,// and since it is an interface the library cannot create an instance
    // for it. Instead it will use the given DefaultTransport to satisfy
    // the dependency since it implements the interface:
    var a HomePlanetRenderApp
    err := g.Provide(
        &inject.Object{Value: &a},&inject.Object{Value: http.DefaultTransport},)
    if err != nil {
        fmt.Fprintln(os.Stderr,err)
        os.Exit(1)
    }

    // Here the Populate call is creating instances of NameAPI &
    // PlanetAPI,and setting the HTTPTransport on both to the
    // http.DefaultTransport provided above:
    if err := g.Populate(); err != nil {
        fmt.Fprintln(os.Stderr,err)
        os.Exit(1)
    }

    // There is a shorthand API for the simple case which combines the
    // three calls above is available as inject.Populate:
    //
    //   inject.Populate(&a,http.DefaultTransport)
    //
    // The above API shows the underlying API which also allows the use of
    // named instances for more complex scenarios.

    fmt.Println(a.Render(42))

}
原文链接:https://www.f2er.com/go/186844.html

猜你在找的Go相关文章