summer

package module
v0.0.0-...-ee03baa Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2017 License: Apache-2.0 Imports: 14 Imported by: 20

README

Summer IOC Framework

summer是一个开箱即用的ioc框架。

功能:

  1. 根据类型或者tag解决组件之间的依赖
  2. 提供toml插件,根据tag直接写入组件的属性,不需要设计config的struct。
  3. 提供生命周期的管理,生命周期分为
    1. init 执行一些不需要依赖其他组件的初始化动作,一般是初始化组件基本信息,如链接数据库,链接zookeeper
    2. ready 组件执行ready表示本身组件已经可被调用,所有依赖组件的功能也可被调用。 此时可以执行一些需要依赖组件的初始化动作
    3. destroy 此时将会销毁或者卸载组件
  4. 定义了插件调用的时间锚点,可以自定义插件.

具体使用示例:

  1. 基本依赖与生命周期
    • 场景:每隔一段时间从redis同步数据到mysql的小程序

    • 代码 (具体见 example/sync-data 目录):

      1. RedisProvider 负责提供redis链接
         func init() {
             summer.Put(&RedisProvider{})
         }
         type RedisProvider struct {
             Client *redis.Client
         }
      
         func (provider *RedisProvider) Init() {
             provider.Client = redis.NewClient(&redis.Options{
                 Addr: Conf.RedisAddr,
             })
             err := provider.Client.Ping().Err()
             if err != nil {
                 panic(err)
             }
         }
      
         func (provider *RedisProvider) Provide() (client *redis.Client) {
             return provider.Client
         }
      
      1. DatabaseProvider 负责提供数据库链接
      func init() {
          summer.Put(&DatabaseProvider{})
      }
      type DatabaseProvider struct {
          DB *sql.DB
      }
      
      func (provider *DatabaseProvider) Init() {
          conn, err := sql.Open("mysql", Conf.MysqlDSN)
          if err != nil {
              panic(err)
          }
          provider.DB = conn
      }
      
      func (provider *DatabaseProvider) Provide() (db *sql.DB) {
          return provider.DB
      }
      
      1. SyncDataWorker 定时执行同步数据操作
       const key = "/key"
      
       func init() {
           summer.Put(&SyncDataWorker{})
       }
      
       type SyncDataWorker struct {
           RedisProvider    *RedisProvider `sm:"*"`
           DatabaseProvider *DatabaseProvider `sm:"*"`
           redisClient      *redis.Client
           db               *sql.DB
       }
      
       func (worker *SyncDataWorker) Run() {
           for {
               if result := worker.redisClient.Get(key); result.Err() == nil {
                   worker.db.Exec("update `test_table` set `text` = ? where `key` = ? ", result.String(), key)
               } else {
                   log.Println(result.Err())
               }
               time.Sleep(time.Minute)
           }
       }
       func (worker *SyncDataWorker) Ready() {
           worker.redisClient = worker.RedisProvider.Provide()
           worker.db = worker.DatabaseProvider.Provide()
           go worker.Run()
       }
      
      

Documentation

Overview

#> What is summer ?

Summer is a easy tool if you just want a simple IOC/DI framework. Summer work based on tag "sm".

If you want to use summer,you must put stone to the summer basket first,

and you must call "Start",then summer can work for you.

#> What is Stone ?

Stone is go stone,like bean is javabean.

#> What is basket ?

A container to store stone,and resolve stones dependents.

Index

Constants

This section is empty.

Variables

View Source
var DefaultBasket = NewBasket()
View Source
var FailFastConfigEnvMode = "mode"
View Source
var NotSupportContainsDot = errors.New("sorry we not support name contains a dot")
View Source
var NotSupportStructErr = errors.New("sorry we not support struct now")

Functions

func Add

func Add(name string, stone Stone, value ...interface{})

add a stone to the default basket with a name

func AddNotStrict

func AddNotStrict(name string, stone Stone, value ...interface{})

func DynamicTomlFile

func DynamicTomlFile(path string, solver tdc.ResourceSolver, listener tdc.Listener) error

func FailFastConfig

func FailFastConfig(path string, resolverAddr string)

func PluginRegister

func PluginRegister(p Plugin, pt PluginWorkTime)

register a plugin to basket

func Put

func Put(stone Stone, value ...interface{})

put a stone into the default basket

func PutNotStrict

func PutNotStrict(stone Stone, value ...interface{})

func SetLogLevel

func SetLogLevel(logLevel LogLevel)

func ShutDown

func ShutDown()

func Start

func Start()

just start

func Strict

func Strict()

func Toml

func Toml(src string) error

func TomlFile

func TomlFile(path string) error

func Work

func Work()

start and wait interrupt signal to shutdown

Types

type Basket

type Basket struct {
	// contains filtered or unexported fields
}

func NewBasket

func NewBasket() *Basket

func (*Basket) Add

func (basket *Basket) Add(name string, stone Stone)

add a stone to basket,the stone must be struct's pointer

func (*Basket) AddNotStrict

func (basket *Basket) AddNotStrict(name string, stone Stone, value interface{})

func (*Basket) AddWithValue

func (basket *Basket) AddWithValue(name string, stone Stone, root interface{}, ignoreStrict bool)

func (*Basket) Each

func (basket *Basket) Each(fn func(holder *Holder))

func (*Basket) EachHolder

func (basket *Basket) EachHolder(fn func(name string, holder *Holder) bool)

func (*Basket) GetStone

func (basket *Basket) GetStone(name string, t reflect.Type) (stone Stone)

get a stone from basket

func (*Basket) GetStoneByType

func (basket *Basket) GetStoneByType(typ interface{}) (result Stone)

func (*Basket) GetStoneHolder

func (basket *Basket) GetStoneHolder(name string, t reflect.Type) (h *Holder)

get a stone holder from basket

func (*Basket) GetStoneHolderWithName

func (basket *Basket) GetStoneHolderWithName(name string) *Holder

get a stone holder from basket

func (*Basket) GetStoneWithName

func (basket *Basket) GetStoneWithName(name string) (stone Stone)

get a stone from basket

func (*Basket) PluginRegister

func (basket *Basket) PluginRegister(plugin Plugin, t PluginWorkTime)

register a plugin to basket

func (*Basket) Put

func (basket *Basket) Put(stone Stone)

put a stone into basket ,the stone must be struct's pointer,the stone name will be that's type's name with first character lowercase for example,if stone's type is Foo then the stone will get a name that is "foo"

func (*Basket) PutDelayField

func (basket *Basket) PutDelayField(field *DelayedField)

func (*Basket) PutNotStrict

func (basket *Basket) PutNotStrict(stone Stone, value interface{})

func (*Basket) PutWithValue

func (basket *Basket) PutWithValue(stone Stone, root interface{}, ignoreStrict bool)

func (*Basket) SafeEach

func (basket *Basket) SafeEach(fn func(holder *Holder))

func (*Basket) ShutDown

func (basket *Basket) ShutDown()

shutdown will call all stone's Destroy method

func (*Basket) Start

func (basket *Basket) Start()

start work

1 : summer will resolve the direct dependency

# 2 : summer will call all stones's Init method<br/> if a directly depend on b, b directly depend on c and d ,then a will init after b init,and b will after c and d

# 3 : summer will call all stones's Ready method<br/> if a depend on b, b depend on c and d ,then a will init after b init,and b will after c and d

func (*Basket) Strict

func (basket *Basket) Strict()

type DelayedField

type DelayedField struct {
	// contains filtered or unexported fields
}

type Destroy

type Destroy interface {
	Destroy()
}

a stone can Destroy

type FieldReferencePlugin

type FieldReferencePlugin struct {
}

func (*FieldReferencePlugin) Look

func (plugin *FieldReferencePlugin) Look(holder *Holder, path string, sf *reflect.StructField) reflect.Value

func (*FieldReferencePlugin) Prefix

func (plugin *FieldReferencePlugin) Prefix() string

func (*FieldReferencePlugin) ZIndex

func (plugin *FieldReferencePlugin) ZIndex() int

type Holder

type Holder struct {
	IgnoreStrict         bool
	Stone                Stone
	Type                 reflect.Type
	PointerType          reflect.Type
	Value                reflect.Value
	Basket               *Basket
	Dependencies         map[*Holder]bool
	TagTemplateRootValue interface{}
}

a holder that can hold stone

func (*Holder) ResolveDirectlyDependents

func (h *Holder) ResolveDirectlyDependents()

func (*Holder) SetDirectDependValue

func (h *Holder) SetDirectDependValue(fieldValue reflect.Value, field reflect.StructField)

in this step we try to find the stone which the field need

type Init

type Init interface {
	Init()
}

a stone can init

type LogLevel

type LogLevel int
const (
	DebugLevel LogLevel = iota
	InfoLevel
	WarnLevel
	ErrorLevel
	PanicLevel
	FatalLevel
)

type Plugin

type Plugin interface {
	// look up the value which field wanted
	Look(Holder *Holder, path string, sf *reflect.StructField) reflect.Value
	// tell  summer the plugin prefix
	Prefix() string
	// zIndex represent the sequence of plugins
	ZIndex() int
}

type PluginWorkTime

type PluginWorkTime int
const (
	BeforeInit PluginWorkTime = iota
	AfterInit
)

type Provider

type Provider interface {
	Provide() interface{}
}

type ProviderPlugin

type ProviderPlugin struct {
}

func (*ProviderPlugin) Look

func (plugin *ProviderPlugin) Look(holder *Holder, path string, sf *reflect.StructField) (need reflect.Value)

func (*ProviderPlugin) Prefix

func (plugin *ProviderPlugin) Prefix() string

func (*ProviderPlugin) ZIndex

func (plugin *ProviderPlugin) ZIndex() int

zIndex represent the sequence of plugins

type Ready

type Ready interface {
	Ready()
}

a stone can ready

type SimpleLog

type SimpleLog struct {
	*SimpleLogger
	// contains filtered or unexported fields
}

func NewSimpleLog

func NewSimpleLog(module string, logLevel LogLevel) *SimpleLog

func (*SimpleLog) Debug

func (log *SimpleLog) Debug(args ...interface{})

func (*SimpleLog) Error

func (log *SimpleLog) Error(args ...interface{})

func (*SimpleLog) Fatal

func (log *SimpleLog) Fatal(args ...interface{})

func (*SimpleLog) Info

func (log *SimpleLog) Info(args ...interface{})

func (*SimpleLog) Panic

func (log *SimpleLog) Panic(args ...interface{})

func (*SimpleLog) Println

func (log *SimpleLog) Println(args ...interface{})

func (*SimpleLog) Warn

func (log *SimpleLog) Warn(args ...interface{})

type SimpleLogger

type SimpleLogger struct {
	// contains filtered or unexported fields
}

func NewSimpleLogger

func NewSimpleLogger(logLevel LogLevel) *SimpleLogger

func (*SimpleLogger) Module

func (logger *SimpleLogger) Module(module string) *SimpleLog

type Stone

type Stone interface{}

a stone is a go stone as you know

func GetStone

func GetStone(name string, t reflect.Type) (stone Stone)

get a stone with the name and the type

func GetStoneByType

func GetStoneByType(typ interface{}) (stone Stone)

func GetStoneWithName

func GetStoneWithName(name string) (stone Stone)

get a tone with the name

type TomlPlugin

type TomlPlugin struct {
	// contains filtered or unexported fields
}

func NewTomlPluginByFilePath

func NewTomlPluginByFilePath(path string) (*TomlPlugin, error)

func NewTomlPluginBySource

func NewTomlPluginBySource(src string) (*TomlPlugin, error)

func (*TomlPlugin) Look

func (plugin *TomlPlugin) Look(h *Holder, path string, sf *reflect.StructField) reflect.Value

func (*TomlPlugin) Prefix

func (plugin *TomlPlugin) Prefix() string

func (*TomlPlugin) ZIndex

func (plugin *TomlPlugin) ZIndex() int

Directories

Path Synopsis
example

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL