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 }