container

package
v0.0.13 Latest Latest
Warning

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

Go to latest
Published: Jan 26, 2026 License: BSD-2-Clause Imports: 8 Imported by: 0

README

Container

依赖注入容器,支持 5 层分层架构的自动依赖管理,交互层包含 4 种组件容器。

特性

  • 5 层容器 - 内置管理器层、Entity、Repository、Service、交互层(Controller/Middleware/Listener/Scheduler 4 种容器)
  • 类型安全 - 泛型注册与获取,编译时类型检查
  • 自动注入 - 通过 inject:"" 结构体标签自动注入依赖
  • 拓扑排序 - Service 层使用 Kahn 算法检测并解决循环依赖
  • 线程安全 - 所有容器操作使用读写锁保护
  • 分层依赖 - 严格的依赖层级,交互层禁止直接注入 Repository
  • Manager 自动初始化 - Engine 自动初始化并注册内置 Manager

快速开始

package application

import (
	"github.com/lite-lake/litecore-go/container"
	"github.com/lite-lake/litecore-go/common"
	"github.com/lite-lake/litecore-go/server"
	entities "yourproject/internal/entities"
	repositories "yourproject/internal/repositories"
	services "yourproject/internal/services"
	controllers "yourproject/internal/controllers"
)

// InitEntityContainer 初始化实体容器
func InitEntityContainer() *container.EntityContainer {
	entityContainer := container.NewEntityContainer()
	container.RegisterEntity[common.IBaseEntity](entityContainer, &entities.Message{})
	return entityContainer
}

// InitRepositoryContainer 初始化仓储容器
func InitRepositoryContainer(entityContainer *container.EntityContainer) *container.RepositoryContainer {
	repositoryContainer := container.NewRepositoryContainer(entityContainer)
	container.RegisterRepository[repositories.IMessageRepository](repositoryContainer, repositories.NewMessageRepository())
	return repositoryContainer
}

// InitServiceContainer 初始化服务容器
func InitServiceContainer(repositoryContainer *container.RepositoryContainer) *container.ServiceContainer {
	serviceContainer := container.NewServiceContainer(repositoryContainer)
	container.RegisterService[services.IMessageService](serviceContainer, services.NewMessageService())
	return serviceContainer
}

// InitControllerContainer 初始化控制器容器
func InitControllerContainer(serviceContainer *container.ServiceContainer) *container.ControllerContainer {
	controllerContainer := container.NewControllerContainer(serviceContainer)
	container.RegisterController[controllers.IMessageController](controllerContainer, controllers.NewMessageController())
	return controllerContainer
}

// NewEngine 创建并启动应用引擎
func NewEngine() (*server.Engine, error) {
	entityContainer := InitEntityContainer()
	repositoryContainer := InitRepositoryContainer(entityContainer)
	serviceContainer := InitServiceContainer(repositoryContainer)
	controllerContainer := InitControllerContainer(serviceContainer)

	return server.NewEngine(
		&server.BuiltinConfig{Driver: "yaml", FilePath: "configs/config.yaml"},
		entityContainer, repositoryContainer, serviceContainer,
		controllerContainer, nil, nil, nil,
	), nil
}

分层架构

容器支持 5 层分层架构,严格遵循依赖方向:

┌─────────────────────────────────────────────────────────────┐
│                交互层 (Interaction Layer)                  │
│  Controller/Middleware/Listener/Scheduler               │
│  (HTTP 请求、MQ 消息、定时任务的统一处理)                    │
├─────────────────────────────────────────────────────────────┤
│                    Service Layer                          │
│              (业务逻辑和数据处理)                          │
│            【支持服务间依赖 + 拓扑排序】                    │
├─────────────────────────────────────────────────────────────┤
│                 Repository Layer                          │
│              (数据访问和持久化)                            │
├─────────────────────────────────────────────────────────────┤
│                    Entity Layer                            │
│              (数据模型和领域对象)                           │
└─────────────────────────────────────────────────────────────┘
            ↑                                              ↑
            └───────────────── Manager Layer ───────────────┘
 (configmgr、loggermgr、databasemgr、cachemgr、lockmgr、
  limitermgr、mqmgr、telemetrymgr、schedulermgr)
依赖规则
可依赖的层 说明
Entity 纯数据模型,无依赖
Manager 其他 Manager 基础能力组件,可相互依赖
Repository Manager + Entity 数据访问层
Service Manager + Repository + Service 业务逻辑,支持服务间依赖
交互层 (Controller) Manager + Service HTTP 请求处理
交互层 (Middleware) Manager + Service 请求拦截器
交互层 (Scheduler) Manager + Service 定时任务
交互层 (Listener) Manager + Service 事件监听器

依赖注入

基本用法

使用 inject:"" 标签标记需要注入的字段:

import (
	"github.com/lite-lake/litecore-go/manager/configmgr"
	"github.com/lite-lake/litecore-go/manager/databasemgr"
	"github.com/lite-lake/litecore-go/manager/loggermgr"
)

type MessageServiceImpl struct {
	ConfigMgr   configmgr.IConfigManager    `inject:""`
	LoggerMgr   loggermgr.ILoggerManager   `inject:""`
	DBManager   databasemgr.IDatabaseManager `inject:""`
	MessageRepo IMessageRepository          `inject:""`
	AuthService IAuthService               `inject:""`
}

func (s *MessageServiceImpl) SomeMethod() error {
	s.logger = s.LoggerMgr.Ins()
	s.logger.Info("处理消息")
	// ...
}
注入顺序

依赖注入按以下优先级解析:

  1. 本层容器 - 优先从当前容器查找(Service → Service)
  2. 下层容器 - 从下层容器查找(Service → Repository)
  3. Manager 容器 - 从 Manager 容器查找(所有层 → Manager)
Service 层拓扑排序

Service 层支持服务间依赖,并使用拓扑排序确保注入顺序:

// ServiceA 依赖 ServiceB
type ServiceA struct {
	ServiceB IServiceB `inject:""`
}

// ServiceB 依赖 ServiceC
type ServiceB struct {
	ServiceC IServiceC `inject:""`
}

// ServiceC 无依赖
type ServiceC struct{}

// 注入顺序:ServiceC → ServiceB → ServiceA
serviceContainer.InjectAll()

如果存在循环依赖,系统会抛出 CircularDependencyError

分层容器

Entity 容器

Entity 层无依赖,仅存储数据实体。

entityContainer := container.NewEntityContainer()
container.RegisterEntity[common.IBaseEntity](entityContainer, &Message{})

// 按名称获取
entity, err := entityContainer.GetByName("Message")

// 按类型获取(可返回多个)
entities, err := entityContainer.GetByType(reflect.TypeOf(&Message{}))

// 获取所有
all := entityContainer.GetAll()
Manager 容器

Manager 容器存储管理器实例,由 Engine 自动初始化。

managerContainer := container.NewManagerContainer()
container.RegisterManager[configmgr.IConfigManager](managerContainer, configMgr)

// 按类型获取
cfg, err := container.GetManager[configmgr.IConfigManager](managerContainer)

// 获取所有(按名称排序)
all := managerContainer.GetAllSorted()
Repository 容器

Repository 层依赖 Manager 和 Entity 层。

repositoryContainer := container.NewRepositoryContainer(entityContainer)
repositoryContainer.SetManagerContainer(managerContainer)

container.RegisterRepository[IMessageRepository](repositoryContainer, repo)

// 执行依赖注入
repositoryContainer.InjectAll()

// 按类型获取
repo, err := container.GetRepository[IMessageRepository](repositoryContainer)
Service 容器

Service 层依赖 Manager、Repository 和其他 Service 层,支持拓扑排序。

serviceContainer := container.NewServiceContainer(repositoryContainer)
serviceContainer.SetManagerContainer(managerContainer)

container.RegisterService[IMessageService](serviceContainer, messageService)
container.RegisterService[IAuthService](serviceContainer, authService)

// 执行依赖注入(自动拓扑排序)
serviceContainer.InjectAll()

// 按类型获取
svc, err := container.GetService[IMessageService](serviceContainer)
Controller 容器

Controller 层依赖 Manager 和 Service 层。

注意:Controller 禁止直接注入 Repository,必须通过 Service 访问数据。

controllerContainer := container.NewControllerContainer(serviceContainer)
container.RegisterController[IMessageController](controllerContainer, messageController)

// 执行依赖注入
controllerContainer.InjectAll()

// 按类型获取
ctrl, err := container.GetController[IMessageController](controllerContainer)
Middleware 容器

Middleware 层依赖 Manager 和 Service 层。

注意:Middleware 禁止直接注入 Repository,必须通过 Service 访问数据。

middlewareContainer := container.NewMiddlewareContainer(serviceContainer)
container.RegisterMiddleware[IAuthMiddleware](middlewareContainer, authMiddleware)

// 执行依赖注入
middlewareContainer.InjectAll()

// 按类型获取
mw, err := container.GetMiddleware[IAuthMiddleware](middlewareContainer)
Scheduler 容器

Scheduler 层依赖 Manager 和 Service 层,用于定时任务。

注意:Scheduler 禁止直接注入 Repository,必须通过 Service 访问数据。

schedulerContainer := container.NewSchedulerContainer(serviceContainer)
container.RegisterScheduler[ICleanupScheduler](schedulerContainer, cleanupScheduler)

// 执行依赖注入
schedulerContainer.InjectAll()

// 按类型获取
scheduler, err := container.GetScheduler[ICleanupScheduler](schedulerContainer)
Listener 容器

Listener 层依赖 Manager 和 Service 层,用于事件监听。

注意:Listener 禁止直接注入 Repository,必须通过 Service 访问数据。

listenerContainer := container.NewListenerContainer(serviceContainer)
container.RegisterListener[IMessageListener](listenerContainer, messageListener)

// 执行依赖注入
listenerContainer.InjectAll()

// 按类型获取
listener, err := container.GetListener[IMessageListener](listenerContainer)

容器 API

EntityContainer
func NewEntityContainer() *EntityContainer
func RegisterEntity[T common.IBaseEntity](e *EntityContainer, impl T) error
func (e *EntityContainer) GetByName(name string) (common.IBaseEntity, error)
func (e *EntityContainer) GetByType(typ reflect.Type) ([]common.IBaseEntity, error)
func (e *EntityContainer) GetAll() []common.IBaseEntity
func (e *EntityContainer) Count() int
func (e *EntityContainer) GetDependency(fieldType reflect.Type) (interface{}, error)
ManagerContainer
func NewManagerContainer() *ManagerContainer
func RegisterManager[T common.IBaseManager](m *ManagerContainer, impl T) error
func GetManager[T common.IBaseManager](m *ManagerContainer) (T, error)
func (m *ManagerContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseManager) error
func (m *ManagerContainer) GetByType(ifaceType reflect.Type) common.IBaseManager
func (m *ManagerContainer) GetAll() []common.IBaseManager
func (m *ManagerContainer) GetAllSorted() []common.IBaseManager
func (m *ManagerContainer) GetNames() []string
func (m *ManagerContainer) Count() int
func (m *ManagerContainer) GetDependency(fieldType reflect.Type) (interface{}, error)
RepositoryContainer
func NewRepositoryContainer(entity *EntityContainer) *RepositoryContainer
func RegisterRepository[T common.IBaseRepository](r *RepositoryContainer, impl T) error
func GetRepository[T common.IBaseRepository](r *RepositoryContainer) (T, error)
func (r *RepositoryContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseRepository) error
func (r *RepositoryContainer) InjectAll() error
func (r *RepositoryContainer) GetByType(ifaceType reflect.Type) common.IBaseRepository
func (r *RepositoryContainer) GetAll() []common.IBaseRepository
func (r *RepositoryContainer) GetAllSorted() []common.IBaseRepository
func (r *RepositoryContainer) Count() int
func (r *RepositoryContainer) SetManagerContainer(container *ManagerContainer)
func (r *RepositoryContainer) GetDependency(fieldType reflect.Type) (interface{}, error)
ServiceContainer
func NewServiceContainer(repository *RepositoryContainer) *ServiceContainer
func RegisterService[T common.IBaseService](s *ServiceContainer, impl T) error
func GetService[T common.IBaseService](s *ServiceContainer) (T, error)
func (s *ServiceContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseService) error
func (s *ServiceContainer) InjectAll() error
func (s *ServiceContainer) GetByType(ifaceType reflect.Type) common.IBaseService
func (s *ServiceContainer) GetAll() []common.IBaseService
func (s *ServiceContainer) GetAllSorted() []common.IBaseService
func (s *ServiceContainer) Count() int
func (s *ServiceContainer) SetManagerContainer(container *ManagerContainer)
func (s *ServiceContainer) GetDependency(fieldType reflect.Type) (interface{}, error)
ControllerContainer
func NewControllerContainer(service *ServiceContainer) *ControllerContainer
func RegisterController[T common.IBaseController](c *ControllerContainer, impl T) error
func GetController[T common.IBaseController](c *ControllerContainer) (T, error)
func (c *ControllerContainer) InjectAll() error
func (c *ControllerContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseController) error
func (c *ControllerContainer) GetByType(ifaceType reflect.Type) common.IBaseController
func (c *ControllerContainer) GetAll() []common.IBaseController
func (c *ControllerContainer) GetAllSorted() []common.IBaseController
func (c *ControllerContainer) Count() int
func (c *ControllerContainer) SetManagerContainer(container *ManagerContainer)
func (c *ControllerContainer) GetDependency(fieldType reflect.Type) (interface{}, error)
MiddlewareContainer
func NewMiddlewareContainer(service *ServiceContainer) *MiddlewareContainer
func RegisterMiddleware[T common.IBaseMiddleware](m *MiddlewareContainer, impl T) error
func GetMiddleware[T common.IBaseMiddleware](m *MiddlewareContainer) (T, error)
func (m *MiddlewareContainer) InjectAll() error
func (m *MiddlewareContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseMiddleware) error
func (m *MiddlewareContainer) GetByType(ifaceType reflect.Type) common.IBaseMiddleware
func (m *MiddlewareContainer) GetAll() []common.IBaseMiddleware
func (m *MiddlewareContainer) GetAllSorted() []common.IBaseMiddleware
func (m *MiddlewareContainer) Count() int
func (m *MiddlewareContainer) SetManagerContainer(container *ManagerContainer)
func (m *MiddlewareContainer) GetDependency(fieldType reflect.Type) (interface{}, error)
SchedulerContainer
func NewSchedulerContainer(service *ServiceContainer) *SchedulerContainer
func RegisterScheduler[T common.IBaseScheduler](c *SchedulerContainer, impl T) error
func GetScheduler[T common.IBaseScheduler](c *SchedulerContainer) (T, error)
func (c *SchedulerContainer) InjectAll() error
func (c *SchedulerContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseScheduler) error
func (c *SchedulerContainer) GetByType(ifaceType reflect.Type) common.IBaseScheduler
func (c *SchedulerContainer) GetAll() []common.IBaseScheduler
func (c *SchedulerContainer) GetAllSorted() []common.IBaseScheduler
func (c *SchedulerContainer) Count() int
func (c *SchedulerContainer) SetManagerContainer(container *ManagerContainer)
func (c *SchedulerContainer) GetDependency(fieldType reflect.Type) (interface{}, error)
ListenerContainer
func NewListenerContainer(service *ServiceContainer) *ListenerContainer
func RegisterListener[T common.IBaseListener](l *ListenerContainer, impl T) error
func GetListener[T common.IBaseListener](l *ListenerContainer) (T, error)
func (l *ListenerContainer) InjectAll() error
func (l *ListenerContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseListener) error
func (l *ListenerContainer) GetByType(ifaceType reflect.Type) common.IBaseListener
func (l *ListenerContainer) GetAll() []common.IBaseListener
func (l *ListenerContainer) GetAllSorted() []common.IBaseListener
func (l *ListenerContainer) Count() int
func (l *ListenerContainer) SetManagerContainer(container *ManagerContainer)
func (l *ListenerContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

错误处理

错误类型
错误类型 说明
DependencyNotFoundError 依赖未找到
CircularDependencyError Service 层循环依赖
AmbiguousMatchError 多重匹配(Entity 层同类型多个实例)
DuplicateRegistrationError 重复注册
InstanceNotFoundError 实例未找到
InterfaceAlreadyRegisteredError 接口已注册
ImplementationDoesNotImplementInterfaceError 实现未实现接口
InterfaceNotRegisteredError 接口未注册
ManagerContainerNotSetError ManagerContainer 未设置
UninjectedFieldError 标记 inject:"" 的字段注入后仍为 nil
错误处理示例
svc, err := container.GetService[IMessageService](serviceContainer)
if err != nil {
	var notFound *container.InstanceNotFoundError
	if errors.As(err, &notFound) {
		log.Fatal("服务未注册:", notFound.Name)
	}
	log.Fatal("获取服务失败:", err)
}

Manager 自动初始化

Engine 会按以下顺序自动初始化内置 Manager:

  1. ConfigManager (manager/configmgr)
  2. TelemetryManager (manager/telemetrymgr)
  3. LoggerManager (manager/loggermgr)
  4. DatabaseManager (manager/databasemgr)
  5. CacheManager (manager/cachemgr)
  6. LockManager (manager/lockmgr)
  7. LimiterManager (manager/limitermgr)
  8. MQManager (manager/mqmgr)

业务代码通过 inject:"" 标签自动注入 Manager:

type MessageService struct {
	Config    configmgr.IConfigManager    `inject:""`
	LoggerMgr loggermgr.ILoggerManager   `inject:""`
	DBManager databasemgr.IDatabaseManager `inject:""`
	CacheMgr  cachemgr.ICacheManager     `inject:""`
}

最佳实践

1. 使用泛型函数注册和获取

泛型函数比按类型注册更安全,避免运行时错误:

// 推荐
container.RegisterService[IMessageService](serviceContainer, svc)
svc, err := container.GetService[IMessageService](serviceContainer)

// 不推荐
serviceContainer.RegisterByType(reflect.TypeOf((*IMessageService)(nil)).Elem(), svc)
2. 按依赖顺序初始化

严格遵循分层架构顺序:

entityContainer := container.NewEntityContainer()
repositoryContainer := container.NewRepositoryContainer(entityContainer)
serviceContainer := container.NewServiceContainer(repositoryContainer)
controllerContainer := container.NewControllerContainer(serviceContainer)
3. Manager 不手动注册

Manager 由 Engine 自动初始化和注册,业务代码只需声明依赖:

type MyService struct {
	ConfigMgr configmgr.IConfigManager `inject:""`
}
4. 避免循环依赖

Service 层的循环依赖会被拓扑排序检测到:

// 错误:循环依赖
type ServiceA struct { ServiceB IServiceB `inject:""` }
type ServiceB struct { ServiceA IServiceA `inject:""` } // ❌

// 正确:通过接口解耦
type ServiceA struct { IDataService IDataService `inject:""` }
type ServiceB struct { IDataService IDataService `inject:""` } // ✅
5. 遵循分层依赖规则
  • Controller/Middleware/Scheduler/Listener 禁止直接注入 Repository
  • 必须通过 Service 访问数据
// 错误
type MyController struct {
	Repo IMessageRepository `inject:""` // ❌
}

// 正确
type MyController struct {
	Service IMessageService `inject:""` // ✅
}
6. 统一使用注入的日志

避免使用标准库 log.Fatal,统一使用注入的 ILoggerManager

type MyService struct {
	LoggerMgr loggermgr.ILoggerManager `inject:""`
	logger    loggermgr.ILogger
}

func (s *MyService) SomeMethod() error {
	s.logger = s.LoggerMgr.Ins()
	s.logger.Info("操作开始")
	// ...
}
7. 使用 CLI 工具生成容器代码

使用 litecore CLI 工具自动生成容器初始化代码:

litecore generate container

生成的代码位于 internal/application/ 目录,自动处理所有容器的初始化和注册。

Documentation

Overview

Package container 提供依赖注入容器功能,支持 7 层分层架构的自动依赖管理。

核心特性:

  • 7 层容器:支持 Entity、Manager、Repository、Service、Controller、Middleware、Scheduler、Listener 八层容器
  • 类型安全:使用泛型确保类型安全,编译时检查
  • 自动注入:通过结构体标签 `inject:""` 自动注入依赖
  • 拓扑排序:Service 层使用 Kahn 算法检测并解决循环依赖
  • 线程安全:所有容器操作都使用读写锁保护
  • 分层依赖:严格的依赖层级,Controller/Middleware/Scheduler/Listener 禁止直接注入 Repository

基本用法:

// 创建容器链(按依赖顺序)
entityContainer := container.NewEntityContainer()
repositoryContainer := container.NewRepositoryContainer(entityContainer)
serviceContainer := container.NewServiceContainer(repositoryContainer)
controllerContainer := container.NewControllerContainer(serviceContainer)
middlewareContainer := container.NewMiddlewareContainer(serviceContainer)
schedulerContainer := container.NewSchedulerContainer(serviceContainer)
listenerContainer := container.NewListenerContainer(serviceContainer)

// 注册实例
container.RegisterEntity(entityContainer, &Message{})
container.RegisterRepository[IMessageRepository](repositoryContainer, repo)
container.RegisterService[IMessageService](serviceContainer, svc)
container.RegisterController[IMessageController](controllerContainer, ctrl)
container.RegisterMiddleware[IAuthMiddleware](middlewareContainer, mw)

服务层拓扑排序:

服务层的依赖注入支持拓扑排序,确保依赖按正确顺序注入。 例如:ServiceA 依赖 ServiceB,ServiceB 依赖 ServiceC, 注入顺序为:ServiceC → ServiceB → ServiceA。循环依赖会触发 CircularDependencyError。

错误处理:

包中定义了多种错误类型:

  • DependencyNotFoundError:依赖未找到
  • CircularDependencyError:Service 层循环依赖
  • AmbiguousMatchError:多重匹配(Entity 层同类型多个实例)
  • DuplicateRegistrationError:重复注册
  • InstanceNotFoundError:实例未找到
  • InterfaceAlreadyRegisteredError:接口已注册
  • ImplementationDoesNotImplementInterfaceError:实现未实现接口
  • InterfaceNotRegisteredError:接口未注册
  • ManagerContainerNotSetError:ManagerContainer 未设置
  • UninjectedFieldError:标记 inject:"" 的字段注入后仍为 nil

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetController added in v0.0.6

func GetController[T common.IBaseController](c *ControllerContainer) (T, error)

GetController 按接口类型获取

func GetListener added in v0.0.7

func GetListener[T common.IBaseListener](l *ListenerContainer) (T, error)

GetListener 按接口类型获取

func GetManager added in v0.0.6

func GetManager[T common.IBaseManager](m *ManagerContainer) (T, error)

GetManager 按接口类型获取

func GetMiddleware added in v0.0.6

func GetMiddleware[T common.IBaseMiddleware](m *MiddlewareContainer) (T, error)

GetMiddleware 按接口类型获取

func GetRepository added in v0.0.6

func GetRepository[T common.IBaseRepository](r *RepositoryContainer) (T, error)

GetRepository 按接口类型获取

func GetScheduler added in v0.0.7

func GetScheduler[T common.IBaseScheduler](c *SchedulerContainer) (T, error)

GetScheduler 按接口类型获取

func GetService added in v0.0.6

func GetService[T common.IBaseService](s *ServiceContainer) (T, error)

GetService 按接口类型获取

func RegisterController

func RegisterController[T common.IBaseController](c *ControllerContainer, impl T) error

RegisterController 泛型注册函数,按接口类型注册

func RegisterEntity

func RegisterEntity[T common.IBaseEntity](e *EntityContainer, impl T) error

RegisterEntity 泛型注册函数,注册实体实例

func RegisterListener added in v0.0.7

func RegisterListener[T common.IBaseListener](l *ListenerContainer, impl T) error

RegisterListener 泛型注册函数,按接口类型注册

func RegisterManager added in v0.0.6

func RegisterManager[T common.IBaseManager](m *ManagerContainer, impl T) error

RegisterManager 泛型注册函数,按接口类型注册

func RegisterMiddleware

func RegisterMiddleware[T common.IBaseMiddleware](m *MiddlewareContainer, impl T) error

RegisterMiddleware 泛型注册函数,按接口类型注册

func RegisterRepository

func RegisterRepository[T common.IBaseRepository](r *RepositoryContainer, impl T) error

RegisterRepository 泛型注册函数,按接口类型注册

func RegisterScheduler added in v0.0.7

func RegisterScheduler[T common.IBaseScheduler](c *SchedulerContainer, impl T) error

RegisterScheduler 泛型注册函数,按接口类型注册

func RegisterService

func RegisterService[T common.IBaseService](s *ServiceContainer, impl T) error

RegisterService 泛型注册函数,按接口类型注册

Types

type AmbiguousMatchError

type AmbiguousMatchError struct {
	InstanceName string
	FieldName    string
	FieldType    reflect.Type
	Candidates   []string // 匹配的候选实例名称
}

AmbiguousMatchError 多重匹配错误

func (*AmbiguousMatchError) Error

func (e *AmbiguousMatchError) Error() string

Error 返回错误信息

type CircularDependencyError

type CircularDependencyError struct {
	Cycle []string // 循环依赖链
}

CircularDependencyError 循环依赖错误

func (*CircularDependencyError) Error

func (e *CircularDependencyError) Error() string

Error 返回错误信息

type ContainerSource

type ContainerSource interface {
	GetDependency(fieldType reflect.Type) (interface{}, error)
}

ContainerSource 容器依赖源接口 容器实现此接口后,可以通过通用依赖解析器解析依赖

type ControllerContainer

type ControllerContainer struct {
	*InjectableLayerContainer[common.IBaseController]
	// contains filtered or unexported fields
}

ControllerContainer 控制器层容器

func NewControllerContainer

func NewControllerContainer(service *ServiceContainer) *ControllerContainer

NewControllerContainer 创建新的控制器容器

func (*ControllerContainer) GetDependency

func (c *ControllerContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

GetDependency 根据类型获取依赖实例(实现ContainerSource接口)

func (*ControllerContainer) InjectAll

func (c *ControllerContainer) InjectAll() error

InjectAll 执行依赖注入

type DependencyNotFoundError

type DependencyNotFoundError struct {
	InstanceName  string       // 当前实例名称
	FieldName     string       // 缺失依赖的字段名
	FieldType     reflect.Type // 期望的依赖类型
	ContainerType string       // 应该从哪个容器查找
	Message       string       // 额外的错误信息
}

DependencyNotFoundError 依赖缺失错误

func (*DependencyNotFoundError) Error

func (e *DependencyNotFoundError) Error() string

Error 返回错误信息

type DuplicateRegistrationError

type DuplicateRegistrationError struct {
	Name     string
	Existing interface{}
	New      interface{}
}

DuplicateRegistrationError 重复注册错误

func (*DuplicateRegistrationError) Error

Error 返回错误信息

type EntityContainer

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

EntityContainer 实体层容器 Entity 层无依赖,无 InjectAll 操作

func NewEntityContainer

func NewEntityContainer() *EntityContainer

NewEntityContainer 创建新的实体容器

func (*EntityContainer) Count

func (e *EntityContainer) Count() int

Count 返回已注册的实体数量

func (*EntityContainer) GetAll

func (e *EntityContainer) GetAll() []common.IBaseEntity

GetAll 获取所有已注册的实体

func (*EntityContainer) GetByName

func (e *EntityContainer) GetByName(name string) (common.IBaseEntity, error)

GetByName 根据名称获取实体

func (*EntityContainer) GetByType

func (e *EntityContainer) GetByType(typ reflect.Type) ([]common.IBaseEntity, error)

GetByType 根据类型获取实体 返回所有实现了该类型的实体列表

func (*EntityContainer) GetDependency

func (e *EntityContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

GetDependency 根据类型获取依赖实例(实现ContainerSource接口) Entity返回列表,但依赖注入需要单个实例,所以返回第一个匹配项 如果有多个匹配项,返回错误

func (*EntityContainer) Register

func (e *EntityContainer) Register(ins common.IBaseEntity) error

Register 注册实体实例

type GenericDependencyResolver

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

GenericDependencyResolver 通用依赖解析器 支持按优先级顺序从多个容器源解析依赖

func NewGenericDependencyResolver

func NewGenericDependencyResolver(
	sources ...ContainerSource,
) *GenericDependencyResolver

NewGenericDependencyResolver 创建通用依赖解析器

func (*GenericDependencyResolver) ResolveDependency

func (r *GenericDependencyResolver) ResolveDependency(fieldType reflect.Type, structType reflect.Type, fieldName string) (interface{}, error)

ResolveDependency 解析字段类型对应的依赖实例 按照sources的顺序依次尝试解析,找到第一个匹配的依赖

type IDependencyResolver

type IDependencyResolver interface {
	ResolveDependency(fieldType reflect.Type, structType reflect.Type, fieldName string) (interface{}, error)
}

IDependencyResolver 依赖解析器接口 各容器通过实现此接口提供自己的依赖解析逻辑

type ImplementationDoesNotImplementInterfaceError

type ImplementationDoesNotImplementInterfaceError struct {
	InterfaceType  reflect.Type
	Implementation interface{}
}

ImplementationDoesNotImplementInterfaceError 实现未实现接口错误

func (*ImplementationDoesNotImplementInterfaceError) Error

Error 返回错误信息

type InjectableContainer added in v0.0.6

type InjectableContainer interface {
	InjectAll() error
}

InjectableContainer 可注入容器接口

type InjectableLayerContainer added in v0.0.6

type InjectableLayerContainer[T any] struct {
	// contains filtered or unexported fields
}

InjectableLayerContainer 可注入层容器基类 为 Controller、Middleware 和 Listener 容器提供公共实现

func NewInjectableLayerContainer added in v0.0.6

func NewInjectableLayerContainer[T any](nameFunc func(T) string) *InjectableLayerContainer[T]

NewInjectableLayerContainer 创建新的可注入层容器

func (*InjectableLayerContainer[T]) Count added in v0.0.6

func (c *InjectableLayerContainer[T]) Count() int

Count 获取实例数量

func (*InjectableLayerContainer[T]) GetAll added in v0.0.6

func (c *InjectableLayerContainer[T]) GetAll() []T

GetAll 获取所有实例

func (*InjectableLayerContainer[T]) GetAllSorted added in v0.0.6

func (c *InjectableLayerContainer[T]) GetAllSorted() []T

GetAllSorted 获取所有实例并按名称排序

func (*InjectableLayerContainer[T]) GetByType added in v0.0.6

func (c *InjectableLayerContainer[T]) GetByType(ifaceType reflect.Type) T

GetByType 按类型获取实例

func (*InjectableLayerContainer[T]) RegisterByType added in v0.0.6

func (c *InjectableLayerContainer[T]) RegisterByType(ifaceType reflect.Type, impl T) error

RegisterByType 按类型注册实例

func (*InjectableLayerContainer[T]) SetManagerContainer added in v0.0.6

func (c *InjectableLayerContainer[T]) SetManagerContainer(container *ManagerContainer)

SetManagerContainer 设置管理器容器

type InstanceNotFoundError

type InstanceNotFoundError struct {
	Name  string
	Layer string
}

InstanceNotFoundError 实例未找到错误

func (*InstanceNotFoundError) Error

func (e *InstanceNotFoundError) Error() string

Error 返回错误信息

type InterfaceAlreadyRegisteredError

type InterfaceAlreadyRegisteredError struct {
	InterfaceType reflect.Type
	ExistingImpl  interface{}
	NewImpl       interface{}
}

InterfaceAlreadyRegisteredError 接口已被注册错误

func (*InterfaceAlreadyRegisteredError) Error

Error 返回错误信息

type InterfaceNotRegisteredError

type InterfaceNotRegisteredError struct {
	InterfaceType reflect.Type
}

InterfaceNotRegisteredError 接口未注册错误

func (*InterfaceNotRegisteredError) Error

Error 返回错误信息

type ListenerContainer added in v0.0.7

type ListenerContainer struct {
	*InjectableLayerContainer[common.IBaseListener]
	// contains filtered or unexported fields
}

ListenerContainer 监听器层容器

func NewListenerContainer added in v0.0.7

func NewListenerContainer(service *ServiceContainer) *ListenerContainer

NewListenerContainer 创建新的监听器容器

func (*ListenerContainer) GetDependency added in v0.0.7

func (l *ListenerContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

GetDependency 根据类型获取依赖实例(实现ContainerSource接口)

func (*ListenerContainer) InjectAll added in v0.0.7

func (l *ListenerContainer) InjectAll() error

InjectAll 执行依赖注入

func (*ListenerContainer) SetManagerContainer added in v0.0.7

func (l *ListenerContainer) SetManagerContainer(container *ManagerContainer)

SetManagerContainer 设置管理器容器

type ManagerContainer added in v0.0.6

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

ManagerContainer 管理器层容器

func NewManagerContainer added in v0.0.6

func NewManagerContainer() *ManagerContainer

NewManagerContainer 创建新的管理器容器

func (*ManagerContainer) Count added in v0.0.6

func (m *ManagerContainer) Count() int

Count 返回已注册的管理器数量

func (*ManagerContainer) GetAll added in v0.0.6

func (m *ManagerContainer) GetAll() []common.IBaseManager

GetAll 获取所有已注册的管理器

func (*ManagerContainer) GetAllSorted added in v0.0.6

func (m *ManagerContainer) GetAllSorted() []common.IBaseManager

GetAllSorted 获取所有已注册的管理器(按名称排序)

func (*ManagerContainer) GetByType added in v0.0.6

func (m *ManagerContainer) GetByType(ifaceType reflect.Type) common.IBaseManager

GetByType 按接口类型获取(返回单例)

func (*ManagerContainer) GetDependency added in v0.0.6

func (m *ManagerContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

GetDependency 根据类型获取依赖实例(实现ContainerSource接口)

func (*ManagerContainer) GetNames added in v0.0.6

func (m *ManagerContainer) GetNames() []string

GetNames 获取所有管理器的名称

func (*ManagerContainer) RegisterByType added in v0.0.6

func (m *ManagerContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseManager) error

RegisterByType 按接口类型注册

type ManagerContainerNotSetError added in v0.0.6

type ManagerContainerNotSetError struct {
	Layer string
}

ManagerContainerNotSetError ManagerContainer 未设置错误

func (*ManagerContainerNotSetError) Error added in v0.0.6

Error 返回错误信息

type MiddlewareContainer

type MiddlewareContainer struct {
	*InjectableLayerContainer[common.IBaseMiddleware]
	// contains filtered or unexported fields
}

MiddlewareContainer 中间件层容器

func NewMiddlewareContainer

func NewMiddlewareContainer(service *ServiceContainer) *MiddlewareContainer

NewMiddlewareContainer 创建新的中间件容器

func (*MiddlewareContainer) GetDependency

func (m *MiddlewareContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

GetDependency 根据类型获取依赖实例(实现ContainerSource接口)

func (*MiddlewareContainer) InjectAll

func (m *MiddlewareContainer) InjectAll() error

InjectAll 执行依赖注入

type NamedContainer added in v0.0.6

type NamedContainer[T any] struct {
	// contains filtered or unexported fields
}

NamedContainer 命名容器 使用名称字符串作为键,存储对应的实例

func NewNamedContainer added in v0.0.6

func NewNamedContainer[T any](nameFunc func(T) string) *NamedContainer[T]

NewNamedContainer 创建新的命名容器

func (*NamedContainer[T]) Count added in v0.0.6

func (c *NamedContainer[T]) Count() int

Count 返回已注册的实例数量

func (*NamedContainer[T]) GetAll added in v0.0.6

func (c *NamedContainer[T]) GetAll() []T

GetAll 获取所有已注册的实例

func (*NamedContainer[T]) GetByName added in v0.0.6

func (c *NamedContainer[T]) GetByName(name string) (T, error)

GetByName 按名称获取实例

func (*NamedContainer[T]) GetNames added in v0.0.6

func (c *NamedContainer[T]) GetNames() []string

GetNames 获取所有实例的名称

func (*NamedContainer[T]) Register added in v0.0.6

func (c *NamedContainer[T]) Register(impl T) error

Register 注册实例

type RepositoryContainer

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

RepositoryContainer 仓储层容器

func NewRepositoryContainer

func NewRepositoryContainer(entity *EntityContainer) *RepositoryContainer

NewRepositoryContainer 创建新的仓储容器

func (*RepositoryContainer) Count

func (r *RepositoryContainer) Count() int

Count 返回已注册的仓储数量

func (*RepositoryContainer) GetAll

GetAll 获取所有已注册的仓储

func (*RepositoryContainer) GetAllSorted added in v0.0.6

func (r *RepositoryContainer) GetAllSorted() []common.IBaseRepository

GetAllSorted 获取所有已注册的仓储(按名称排序)

func (*RepositoryContainer) GetByType

func (r *RepositoryContainer) GetByType(ifaceType reflect.Type) common.IBaseRepository

GetByType 按接口类型获取

func (*RepositoryContainer) GetDependency

func (r *RepositoryContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

GetDependency 根据类型获取依赖实例(实现ContainerSource接口)

func (*RepositoryContainer) InjectAll

func (r *RepositoryContainer) InjectAll() error

InjectAll 执行依赖注入

func (*RepositoryContainer) RegisterByType

func (r *RepositoryContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseRepository) error

RegisterByType 按接口类型注册

func (*RepositoryContainer) SetManagerContainer added in v0.0.6

func (r *RepositoryContainer) SetManagerContainer(container *ManagerContainer)

SetManagerContainer 设置管理器容器

type SchedulerContainer added in v0.0.7

type SchedulerContainer struct {
	*InjectableLayerContainer[common.IBaseScheduler]
	// contains filtered or unexported fields
}

SchedulerContainer 定时器层容器

func NewSchedulerContainer added in v0.0.7

func NewSchedulerContainer(service *ServiceContainer) *SchedulerContainer

NewSchedulerContainer 创建新的定时器容器

func (*SchedulerContainer) GetDependency added in v0.0.7

func (c *SchedulerContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

GetDependency 根据类型获取依赖实例(实现ContainerSource接口)

func (*SchedulerContainer) InjectAll added in v0.0.7

func (c *SchedulerContainer) InjectAll() error

InjectAll 执行依赖注入

func (*SchedulerContainer) SetManagerContainer added in v0.0.7

func (c *SchedulerContainer) SetManagerContainer(container *ManagerContainer)

SetManagerContainer 设置管理器容器

type ServiceContainer

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

ServiceContainer 服务层容器

func NewServiceContainer

func NewServiceContainer(repository *RepositoryContainer) *ServiceContainer

NewServiceContainer 创建新的服务容器

func (*ServiceContainer) Count

func (s *ServiceContainer) Count() int

Count 返回已注册的服务数量

func (*ServiceContainer) GetAll

func (s *ServiceContainer) GetAll() []common.IBaseService

GetAll 获取所有已注册的服务

func (*ServiceContainer) GetAllSorted added in v0.0.6

func (s *ServiceContainer) GetAllSorted() []common.IBaseService

GetAllSorted 获取所有已注册的服务(按名称排序)

func (*ServiceContainer) GetByType

func (s *ServiceContainer) GetByType(ifaceType reflect.Type) common.IBaseService

GetByType 按接口类型获取

func (*ServiceContainer) GetDependency

func (s *ServiceContainer) GetDependency(fieldType reflect.Type) (interface{}, error)

GetDependency 根据类型获取依赖实例(实现ContainerSource接口)

func (*ServiceContainer) InjectAll

func (s *ServiceContainer) InjectAll() error

InjectAll 执行依赖注入

func (*ServiceContainer) RegisterByType

func (s *ServiceContainer) RegisterByType(ifaceType reflect.Type, impl common.IBaseService) error

RegisterByType 按接口类型注册

func (*ServiceContainer) SetManagerContainer added in v0.0.6

func (s *ServiceContainer) SetManagerContainer(container *ManagerContainer)

SetManagerContainer 设置管理器容器

type TypedContainer added in v0.0.6

type TypedContainer[T any] struct {
	// contains filtered or unexported fields
}

TypedContainer 类型化容器 使用接口类型作为键,存储对应的实现实例

func NewTypedContainer added in v0.0.6

func NewTypedContainer[T any](nameFunc func(T) string) *TypedContainer[T]

NewTypedContainer 创建新的类型化容器

func (*TypedContainer[T]) Count added in v0.0.6

func (c *TypedContainer[T]) Count() int

Count 返回已注册的实例数量

func (*TypedContainer[T]) GetAll added in v0.0.6

func (c *TypedContainer[T]) GetAll() []T

GetAll 获取所有已注册的实例

func (*TypedContainer[T]) GetByType added in v0.0.6

func (c *TypedContainer[T]) GetByType(ifaceType reflect.Type) T

GetByType 按接口类型获取实现实例

func (*TypedContainer[T]) GetNames added in v0.0.6

func (c *TypedContainer[T]) GetNames() []string

GetNames 获取所有实例的名称

func (*TypedContainer[T]) IsInjected added in v0.0.6

func (c *TypedContainer[T]) IsInjected() bool

IsInjected 返回是否已完成依赖注入

func (*TypedContainer[T]) RangeItems added in v0.0.6

func (c *TypedContainer[T]) RangeItems(fn func(reflect.Type, T) bool)

RangeItems 遍历所有实例

func (*TypedContainer[T]) Register added in v0.0.6

func (c *TypedContainer[T]) Register(ifaceType reflect.Type, impl T) error

Register 按接口类型注册实现实例

type UninjectedFieldError added in v0.0.6

type UninjectedFieldError struct {
	InstanceName string
	FieldName    string
	FieldType    reflect.Type
}

UninjectedFieldError 未注入字段错误

func (*UninjectedFieldError) Error added in v0.0.6

func (e *UninjectedFieldError) Error() string

Error 返回错误信息

Jump to

Keyboard shortcuts

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