Go DI LoC 依赖注入研究

栏目: Go · 发布时间: 7年前

内容简介:依赖注入,控制反转 设计模式目的:实现模块与项目的解耦实现流程

依赖注入,控制反转 设计模式

目的:实现模块与项目的解耦

实现流程

首先模块有指针,其次DI拿到指针,再次DI将指针赋给调用者

共调研了三个框架:iris内置的di&mvc,uber-dig,google/wire

最终决定使用 wire

google DI 框架 wire

它通过使用代码生成构建容器来避免运行时反射。

用法:

// file main.go

package main
import "bytes"

type Logger struct{}

func (logger *Logger) Log(message string) {
    println(message)
}

type HttpClient struct {
    logger *Logger
}

func (client *HttpClient) Get(url string) string {
    client.logger.Log("Getting " + url)
    return "my response from " + url
}

func NewHttpClient(logger *Logger) *HttpClient {
    return &HttpClient{logger}
}

type ConcatService struct {
    logger *Logger
    client *HttpClient
}

func NewConcatService(logger *Logger, client *HttpClient) *ConcatService {
    return &ConcatService{logger, client}
}
func (service *ConcatService) GetAll(urls ...string) string {
    service.logger.Log("Runing GetAll")
    var result bytes.Buffer
    for _, url := range urls {
        result.WriteString(service.client.Get(url))
    }
    return result.String()
}

func main() {
    service := CreateConcatService()
    result := service.GetAll(
        "http://example.com",
        "https://drewolson.org",
    )
    println(result)
}
// file container.go

package main

import (
    "github.com/google/wire"
)

// CreateConcatService 设置 service 的依赖
// wire 生成 wire_gen.go 的 模板文件
func CreateConcatService() *ConcatService {
    panic(wire.Build(
        wire.NewSet(wire.Struct(new(Logger))), // struct 使用 wire.Struct 创建
        NewHttpClient,
        NewConcatService,
    ))
}
 go get github.com/google/wire/cmd/wire  wire

执行 wire 解析 container.go ——> wire_gen.go

解析完毕后删除 container.go 文件, 使用 wire_gen.go 中的方法就行


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Introduction to Programming in Java

Introduction to Programming in Java

Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00

By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具