github.com/d0ngw/go@v1.1.40/inject/inject_helper.go (about)

     1  package inject
     2  
     3  import (
     4  	"os"
     5  	"path"
     6  
     7  	c "github.com/d0ngw/go/common"
     8  )
     9  
    10  // ConfigModuler get module depends on the config
    11  type ConfigModuler interface {
    12  	ConfModule() (module *Module, err error)
    13  }
    14  
    15  // SetupInjector 从env指定的环境配置初始化配置,构建Injector
    16  func SetupInjector(config c.Configurer, addonConfig string, env string, modules ...*Module) (*Injector, error) {
    17  	return SetupInjectorWithLoader(c.FileLoader, config, addonConfig, env, modules...)
    18  }
    19  
    20  // EnvConfRoot conf root
    21  const EnvConfRoot = "conf_root"
    22  
    23  // SetupInjectorWithLoader 从env指定的环境配置初始化配置,构建Injector
    24  func SetupInjectorWithLoader(loader c.ConfigLoader, config c.Configurer, addonConfig string, env string, modules ...*Module) (*Injector, error) {
    25  	confDir := "conf"
    26  	if os.Getenv(EnvConfRoot) != "" {
    27  		confDir = os.Getenv(EnvConfRoot)
    28  	}
    29  	var (
    30  		confs = []string{"common.yaml"}
    31  	)
    32  
    33  	if env != "" {
    34  		confs = append(confs, "conf_"+env+".yaml")
    35  	} else {
    36  		confs = append(confs, "conf.yaml")
    37  	}
    38  
    39  	for _, f := range confs {
    40  		conf := path.Join(confDir, f)
    41  		if exist, err := loader.Exist(conf); err != nil {
    42  			c.Errorf("check %s fail, err:%v", conf, err)
    43  			return nil, err
    44  		} else if !exist {
    45  			c.Warnf("%s doesn't exist, skip", conf)
    46  		} else {
    47  			c.Infof("load conf from %s ", conf)
    48  			if content, err := loader.Load(conf); err != nil {
    49  				c.Errorf("load %s fail,err:%v", conf, err)
    50  				return nil, err
    51  			} else if len(content) > 0 {
    52  				addonConfig += "\n" + string(content) + "\n"
    53  			}
    54  		}
    55  	}
    56  
    57  	err := c.LoadConfigWithLoader(loader, config, addonConfig, confDir)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  	err = config.Parse()
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  
    66  	var confModule *Module
    67  	if configModuler, ok := config.(ConfigModuler); ok {
    68  		if confModule, err = configModuler.ConfModule(); err != nil {
    69  			return nil, err
    70  		}
    71  	}
    72  
    73  	// 绑定核心的服务
    74  	module := NewModule()
    75  	module.Bind(config)
    76  	var allModuls []*Module
    77  	allModuls = append(allModuls, module)
    78  	allModuls = append(allModuls, modules...)
    79  	if confModule != nil {
    80  		allModuls = append(allModuls, confModule)
    81  	}
    82  	injector := NewInjector(allModuls)
    83  	err = injector.Initialize()
    84  	if err != nil {
    85  		return nil, err
    86  	}
    87  	return injector, nil
    88  }
    89  
    90  // Injected 判断是否已经完成注入
    91  type Injected interface {
    92  	// 是否已经完成注入
    93  	IsInjected() bool
    94  }
    95  
    96  // IsInjected 判断i是否实现了Injected接口
    97  // 当i实现了Injected接口时,ok为true,这时injected表示接口i是否已经完成了注入
    98  func IsInjected(i interface{}) (ok bool, injected bool) {
    99  	if i == nil {
   100  		return
   101  	}
   102  	injectedi, ok := i.(Injected)
   103  	if ok {
   104  		injected = injectedi.IsInjected()
   105  	}
   106  	return
   107  }