1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        yoyogo-diGo 語(yǔ)言依賴注入框架

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

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

        此次升級(jí)將 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è)簡(jiǎn)單的構(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()

        注冊(cè)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í)際的情況,類型間會(huì)有大量依賴,組件A依賴組件B,這種情況我們使用 di.Parameter 來聲明結(jié)構(gòu)體,對(duì)其它提供者提供多依賴管理:

        // 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è)簡(jiǎn)單、輕量、快速、基于依賴注入的微服務(wù)框架( web 、grpc、xxl-job、console ),支持的注冊(cè)中心 Nacos/Consoul/Etcd/Eureka/k8s 等。

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            芬兰xxxx性hd极品 | 午夜成人精品一区二区三区 | 日本奸妻乱伦一区二区 | 欧洲一区二区在线 | 999sesese | 羽月希母乳| 精品91自产拍在线观看 | 日日躁夜夜摸月月添添添 | 亚洲美女操B视频 | 美女直播一区二区三区 |