跳转到内容

服务容器

Goravel服务容器是一个强大的工具,用于管理类依赖和执行依赖注入。 它包含了Goravel的所有模块,并允许你将自己的服务绑定到容器中,并在需要时解析它们。 服务容器为Goravel周边的第三方包提供了强大的支持。

绑定

简单绑定

几乎所有的服务容器绑定都将在服务提供者中注册。 在服务提供者中,你始终可以通过app参数访问容器,然后使用Bind方法注册绑定,传递我们希望注册的key以及返回类实例的闭包:

go
package route

import (
 "github.com/goravel/framework/contracts/foundation"
)

const Binding = "goravel.route"

type ServiceProvider struct {
}

func (route *ServiceProvider) Register(app foundation.Application) {
 app.Bind(Binding, func(app foundation.Application) (any, error) {
  return NewRoute(app.MakeConfig()), nil
 })
}

func (route *ServiceProvider) Boot(app foundation.Application) {

}

如前所述,您通常会在服务提供者中与容器进行交互;但是,如果您想在服务提供者之外与容器进行交互,可以通过 App 门面来实现:

go
facades.App().Bind("key", func(app foundation.Application) (any, error) {
    ...
})

绑定单例

Singleton 方法将一个类或接口绑定到容器中,该类或接口只应被解析一次。 一旦单例绑定被解析,在后续对容器的调用中将返回相同的对象实例:

go
app.Singleton(key, func(app foundation.Application) (any, error) {
    return NewGin(app.MakeConfig()), nil
})

绑定实例

您也可以使用 Instance 方法将现有的对象实例绑定到容器中。 在后续对容器的调用中,将始终返回给定的实例:

go
app.Instance(key, instance)

带参数绑定

如果你需要一些额外的参数来构造服务提供者,你可以使用 BindWith 方法将参数传递给闭包:

go
app.BindWith(Binding, func(app foundation.Application, parameters map[string]any) (any, error) {
    return NewRoute(app.MakeConfig()), nil
})

解析

Make 方法

你可以使用 Make 方法从容器中解析一个类实例。 Make 方法接受你想要解析的 key

go
instance, err := app.Make(key)

如果你在服务提供者之外的代码位置,无法访问 app 变量,你可以使用 App 门面从容器中解析一个类实例:

go
instance, err := facades.App().Make(key)

MakeWith 方法

如果你的类的某些依赖项无法通过容器解析,你可以通过将它们作为关联数组传递给 MakeWith 方法来注入它们,这与 BindWith 绑定方法相对应:

go
instance, err := app.MakeWith(key, map[string]any{"id": 1})

其他方法

框架提供了一些便捷方法来快速解析各种门面:MakeArtisanMakeAuthMakeCacheMakeConfigMakeCryptMakeEventMakeGateMakeGrpcMakeHashMakeLogMakeMailMakeOrmMakeQueueMakeRateLimiterMakeRouteMakeScheduleMakeStorageMakeValidation

基于 MIT 许可发布