<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          yoyogo-diGo 語言依賴注入框架

          聯(lián)合創(chuàng)作 · 2023-09-30 06:52

          Dependency injection 依賴注入是更廣泛的控制反轉(zhuǎn)技術(shù)的一種形式。它的作用是提高程序的模塊化和可擴(kuò)展性。

          此次升級將 DI 獨(dú)立,以便之后集成更多外圍生態(tài),開源地址:https://github.com/yoyofxteam/dependencyinjection

          它分為(高/低)層API接口,下面展示下高層API:

          type A struct {
          	Name string
          }
          
          func NewA() *A {
          	r := rand.New(rand.NewSource(time.Now().UnixNano()))
          	name := "A-" + strconv.Itoa(r.Int())
          	return &A{Name: ls}
          }
          
          services := NewServiceCollection()
          services.AddSingleton(NewA)
          //serviceCollection.AddSingletonByImplementsAndName("redis-master", NewRedis, new(abstractions.IDataSource))
          //serviceCollection.AddTransientByImplements(NewRedisClient, new(redis.IClient))
          //serviceCollection.AddTransientByImplements(NewRedisHealthIndicator, new(health.Indicator))
          serviceProvider := services.Build()
          
          var env *A
          _ = serviceProvider.GetService(&env) // used

          框架安裝

          go get -u github.com/yoyofxteam/[email protected]

          服務(wù)提供者

          首先服務(wù)提供者都是以構(gòu)造器的形式提供的,我們需要?jiǎng)?chuàng)建兩個(gè)基本類型:http.server和http.ServeMux。讓我們創(chuàng)建一個(gè)簡單的構(gòu)造函數(shù)來初始化它

          // NewServer creates a http server with provided mux as handler.
          func NewServer(mux *http.ServeMux) *http.Server {    
              return &http.Server{
                  Handler: mux,
              }
          }
          
          // NewServeMux creates a new http serve mux.
          func NewServeMux() *http.ServeMux {    
              return &http.ServeMux{}
          }

          支持的構(gòu)造器簽名如下

          func([dep1, dep2, depN]) (result, [cleanup, error])

          構(gòu)建一個(gè)DI容器

          import (
            di "github.com/yoyofxteam/dependencyinjection"
          )
          
          container := di.New(    // provide http server
              di.Provide(NewServer),    // provide http serve mux
              di.Provide(NewServeMux)
          )

          獲取容器中的實(shí)例

          // declare type variable
          var server *http.Server
          // extracting
          err := container.Extract(&server)
          if err != nil {    
          // check extraction error
          }
          
          server.ListenAndServe()

          注冊Naming定義提供者

          // MasterDatabase provide write database access.
          type MasterDatabase struct {
              *Database
          }  // SlaveDatabase provide read database access.
          type SlaveDatabase struct {
              *Database
          } // provide master database
          
          di.Provide(NewMasterDatabase, di.WithName("master"))
          // provide slave database
          di.Provide(NewSlaveDatabase, di.WithName("slave"))
          
          var database *Database
          err := container.Extract(&database,di.Name(master))  // get master databse

          依賴關(guān)聯(lián)

          可能實(shí)際的情況,類型間會有大量依賴,組件A依賴組件B,這種情況我們使用 di.Parameter 來聲明結(jié)構(gòu)體,對其它提供者提供多依賴管理:

          // ServiceParameters
          type ServiceParameters struct {
              di.Parameter
              MasterDatabase *Database `di:"master"`
              SlaveDatabase *Database  `di:"slave,optional"`   // optional 可選參數(shù),如果沒有實(shí)例則為nil}// NewService creates new service with provided parameters.func NewService(parameters ServiceParameters) *Service {    return &Service{
                  MasterDatabase:  parameters.MasterDatabase,
                  SlaveDatabase: parameters.SlaveDatabase,
              }
          }

          Cleanup函數(shù)

          提供者構(gòu)造器返回清理函數(shù)用于銷毀實(shí)例和釋放資源,它由容器的container.Cleanup()函數(shù)統(tǒng)一管理:

          func NewFile(log Logger, path Path) (*os.File, func(), error) {
              f, err := os.Open(string(path))    if err != nil {        return nil, nil, err
              }
              cleanup := func() {        if err := f.Close(); err != nil {
                      log.Log(err)
                  }
              }    return f, cleanup, nil
          }

          此項(xiàng)目已集成到 yoyogo框架中:

          gitee:    https://gitee.com/yoyofx/yoyogo            github:  https://github.com/yoyofx/yoyogo

          ???? YoyoGo 一個(gè)簡單、輕量、快速、基于依賴注入的微服務(wù)框架( web 、grpc、xxl-job、console ),支持的注冊中心 Nacos/Consoul/Etcd/Eureka/k8s 等。

          瀏覽 11
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一级片在线视频 | 久久夜色精品国产亚洲 | 日韩黄色视频大全 | 亚洲A∨网站 | 日本一区二区三区在线观看网站 |