Firmeve
1.0.0
1.0.0
  • Firmeve
  • [核心组件]
    • 应用
    • 容器
    • 配置
    • 提供者
    • 事件
    • 日志
    • 命令
  • [基础组件]
    • Http服务
    • 数据验证
    • 数据库
    • 缓存
    • JWT
    • Redis
    • 辅助函数
    • 队列
    • 计划任务
Powered by GitBook
On this page
  • 简介
  • 创建服务提供者
  • 注册方法
  • 启动方法
  • 基础示例
  • 挂载提供者

Was this helpful?

  1. [核心组件]

提供者

简介

借鉴于Laravel思想,使用Provider来解决模块的依赖和解耦。

可以看到Firmeve中的模块都是使用Provider来注册和启动的。

在后续的开发的,我们推荐使用Provider来解决依赖和参数解耦。

创建服务提供者

注册方法

Register方法作为提供者注册初始化模块实例,所有的提供者在系统加载时都会优先使用注册方法,来完成需要的实例创建。

Register方法就是为了模块能够正常运行而提供的基础实例

启动方法

当所有的Provider加载并注册完成后,会自动调用Boot方法来唤醒当前模块。Boot方法就是模块启动的入口

基础示例

所有Provider都可以使用kernel.BaseProvider嵌入,kernel.BaseProvider主要是基于Container进行包装的快捷调用。

package app

import (
    config2 "github.com/firmeve/firmeve/config"
    "github.com/firmeve/firmeve/container"
    "github.com/firmeve/firmeve/kernel"
)

type Provider struct {
    kernel.BaseProvider
}

func (p *Provider) Name() string {
    return `app`
}

// Register
func (p *Provider) Register() {
    config := p.Resolve(`config`).(*config2.Config).Item(`logging`)
    p.Bind(`logger`, New(config), container.WithShare(true))
}

// Boot method
func (p *Provider) Boot() {

}

挂载提供者

通常我们会在main函数中初始化时挂载我们需要的提供者

func main()  {
    firmeve.Run(firmeve.WithProviders(
        []contract.Provider{
            // base
            new(http.Provider),
            new(database.Provider),
            new(validator.Provider),
            new(jwt.Provider),

            // app
            new(providers.AppProvider),

            // component
            new(providers.SpiderProvider),
        },
    ),firmeve.WithCommands(
        []contract.Command{
            new(http.HttpCommand),
            new(spider.Command),
            new(database.MigrateCommand),
        },
    ))
}

如果某个Provider需要依赖于另一个Provider才可以启动,那么我们可在服务内部进行注册,如:

type AppProvider struct{
    kernel.BaseProvider
}

func (AppProvider) Name() string {
    return `app`
}

func (p *AppProvider) Register() {
  // 是否进行注册HttpProvider
  // 第二个参数表示,是否强制覆盖注册
  p.Firmeve.Register(new(HttpProvider), false)
}

func (p *AppProvider) Boot() {

}
Previous配置Next事件

Last updated 4 years ago

Was this helpful?