LaravelApplicationSpring

今天我们来看看 go 里面实现依赖注入的一种方式,以 flamego 里的 inject 为例子。

我们要了解一个软件的设计,先要看它定义了一个什么样的模型,但是在了解模型之前,我们更应该清楚了解,为什么会出现这个模型,也就是我们构建出了这个模型到底是为了解决什么问题。

依赖注入要解决的问题

struct
testCCBBA
testtest

所以现在的 web 框架里面一般都将这个实例化的过程固化下来,在框架的某个地方注册一些实例化的函数,在我们需要的时候就调用之前注册的实例化的函数,实例化之后,再根据需要看看是否需要将这个实例保留在内存里面,从而在免去了手动实例化的过程之外,节省我们资源的开销(不用每次使用的时候都实例化一次)。

LaravelServiceProviderapp()->register()app()->bind()

inject 依赖注入模型/设计

InjectorInjectorApplicatorInvokerTypeMapper
InjectorApplicatorInvokerTypeMapperInjectorLaravelInjector

表示成图像大概如下:

InjectorTypeMapperApplicatorInvoker
SetParentInjectorInjectorInjector
InjectorSetParent

injector 的依赖注入实现

injector
valuesparentTypeMappervaluesvalues
TypeMapperMap
MapvaluesvaluesMapToSet
Injector

那么它又是如何去从依赖注入容器里面拿到我们注入的数据的呢?又是如何使用这些数据的呢?

callInvokeInjectorInvoke

参数和返回值说明:

reflect.Valueerror
freflect.TypeInjectorreflect.ValueOf(f)fInjectorreflect.Value
hyperfSpringInjectorApply
InjectorTypeMapperApplyInvoke

例子

还是以一开始的例子为例,通过依赖注入的方式来改造一下:

inj.Mapinj.Invoketesttesttest
Cinj.InvokeC