ioc

package
v0.0.0-...-8c4fe33 Latest Latest
Warning

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

Go to latest
Published: May 29, 2023 License: MIT Imports: 6 Imported by: 7

README

花3分钟写的简易IoC,放在Golang的项目中太好用了~

一、什么是IOC

注:本文是利用了Ioc的一些思想,实现了简易版的IoC容器,和IoC的原思想有些不一致。可以小马过河,因人而异~

一句话解释:将对象利用控制反转的方式,在容器中创建出Bean,并且可以自动注入Bean所需的依赖。

简易版IoC:将依赖注入容器中后,用控制反转的方式,从IoC容器中获取所需要的依赖。

应该很懵吧:什么是控制反转?什么又是依赖?注入之后怎么取出来勒?

如果这几个概念你很清楚,那咱不浪费大哥们的时间,直接跳第二节去~ 但是为了照顾像我一样cer头cer脑的小朋友,咱们来看看这几个问题~~~

(1)什么是依赖注入?
1、原本的

DI(Dependence Inject)称为依赖注入,原本的思想是。如果A实例依赖B实例

如下代码所示:

type A struct {
    // A对象依赖对象 B
    b B
}

type B struct {
    name string
}

在程序启动时,初始化IoC容器的时候,会通过一定的手段(如:通过注解、通过配置文件), 自动扫描到在创建实例化A时,需要依赖对象B。这时候会直接从IoC中取出对象B,注入给A对象。

2、简易版

简单说明了上面的那种解释,不理解没关系,因为我们要实现的简易版, 我们的依赖注入指的是:程序启动时,如何将IoC容器所依赖的对象,注入其中。

就好比,你去找医生看病。你的身体是容器,它病了,需要依赖药品。医生该如何将药注入你的身体,或者你选择什么样的注入方式:

  1. 口服
  2. 用针管注入
  3. 输液

然后注入容器之后,然后之后你的免疫系统需要依赖他们来杀死病毒。只需要从你的身体中取出抗体即可。

(2)怎么注入容器?
(2)控制怎么就反转了?

二、为什么会有IOC

一句话解释:为了方便管理依赖咯~

你可能要继续疑惑了,怎么就方便了?当然,如果大哥你也理解了,那咱们跳第三节怎么样。

(1)没有IoC时
(2)有IoC之后

三、开始实践了

好滴,相信大哥们多多少少都了解了关于IoC的一些概念,那咱们开始制作装依赖的容器吧!

(1)初阶简易版本

一般会用很多种容器,来装不一样的依赖。

比如你家里的大衣柜,你不可能把所有衣物,一啪啦的全扔进去吧。(也太......像我了吧???) 人类自古就有分而治之的思想,可能会把它分成很多个装衣服的容器:有装衬衫的、装领带的、装西装、装裤子...

既然你也同意这个观点了,那我们先来实现一个用来装内部服务对象的容器,其余的类似

(2)完整简易版本
(3)拓展IOC

Documentation

Overview

@Author: Ciusyan 2023/1/28

@Author: Ciusyan 2023/1/28

@Author: Ciusyan 2023/1/28

@Author: Ciusyan 2023/1/28

Index

Constants

View Source
const (
	USER_API     = "user"
	VIDEO_API    = "video"
	RELATION_API = "relation"
)

Variables

This section is empty.

Functions

func ExistingGinDependencies

func ExistingGinDependencies() (apps []string)

ExistingGinDependencies 返回Gin HTTP服务依赖的容器中已存在的依赖名称

func ExistingGrpcDependencies

func ExistingGrpcDependencies() (apps []string)

ExistingGrpcDependencies 返回GRPC服务依赖的容器中已存在的依赖名称

func ExistingInternalDependencies

func ExistingInternalDependencies() (apps []string)

ExistingInternalDependencies 返回内部服务依赖的容器中已存在的依赖名称

func GinDI

func GinDI(dependency GinDependency)

GinDI :将依赖注入此容器,Gin DI(Gin Dependency Inject)

func GrpcDI

func GrpcDI(dependency GrpcDependency)

GrpcDI :将依赖注入此容器,Grpc DI(Grpc Dependency Inject)

func InitAllDependencies

func InitAllDependencies() error

InitAllDependencies 用于初始IoC容器中的所有依赖

func InternalDI

func InternalDI(dependency InternalDependency)

InternalDI :将依赖注入此容器,Internal DI(Internal Dependency Inject)

func RegistryGin

func RegistryGin(opts *GinOptions)

RegistryGin 注册所有的Gin Http 服务

func RegistryGrpc

func RegistryGrpc(s *grpc.Server)

RegistryGrpc 注册所有的Grpc服务

Types

type AppName

type AppName string

type GinDefault

type GinDefault struct{}

GinDefault 类似与GRPC的做法,提供一个默认实现的结构体,方便外界使用

func (GinDefault) Init

func (g GinDefault) Init() error

func (GinDefault) Name

func (g GinDefault) Name() string

func (GinDefault) Registry

func (g GinDefault) Registry(r gin.IRoutes)

func (GinDefault) RegistryWithMiddle

func (g GinDefault) RegistryWithMiddle(r gin.IRoutes)

func (GinDefault) Version

func (g GinDefault) Version() string

type GinDependency

type GinDependency interface {
	InternalDependency
	// Registry 该模块所需要注册的路由:添加传递的中间件
	// [因为gin不支持路由装饰,只能使用路由分组的方式区分特殊的路由(如:添加中间件)]
	Registry(r gin.IRoutes)
	// RegistryWithMiddle 该用于注册特殊的路由:不添加传递的中间件
	RegistryWithMiddle(r gin.IRoutes)
	// Version 该服务API的版本
	Version() string
}

GinDependency Gin HTTP的服务实例想要注入此容器,必须实现该接口

func GetGinDependency

func GetGinDependency(name string) GinDependency

GetGinDependency 根据模块名称 获取内部服务模块的依赖,外部使用时需自己断言,如:

userGin = ioc.GetGinDependency("user").(user.UserGin)

type GinOptions

type GinOptions struct {
	// 路由
	Router gin.IRouter `json:"router"`
	// API 前缀
	Prefix string `json:"prefix"`
	// API 中间件
	Middleware []gin.HandlerFunc `json:"middleware"`
	// API 是否需要添加版本
	NotVersion bool `json:"not_version"`
	// API 是否需要添加服务名称
	NotName bool `json:"not_name"`
}

GinOptions 注册IOC中Gin服务的路由时,可传入配置

func NewGinOption

func NewGinOption(r gin.IRouter, prefix string, middle ...gin.HandlerFunc) *GinOptions

NewGinOption :路由对象、前缀、中间件

type GrpcDependency

type GrpcDependency interface {
	InternalDependency
	// Registry 该模块所需要注册的GRPC服务
	Registry(s *grpc.Server)
}

GrpcDependency GRPC 服务的实例想要注入此容器,必须实现该接口

func GetGrpcDependency

func GetGrpcDependency(name string) GrpcDependency

GetGrpcDependency 根据模块名称 获取GRPC服务模块的依赖,外部使用时需自己断言,如:

userGrpc = ioc.GetGrpcDependency("user").(user.UserGrpc)

type InternalDependency

type InternalDependency interface {
	// Init 如何初始化注入此 IoC 的实例
	Init() error
	// Name 注入服务模块的名称
	Name() string
}

InternalDependency 内部服务的实例想要注入此容器,必须实现该接口

func GetInternalDependency

func GetInternalDependency(name string) InternalDependency

GetInternalDependency 根据模块名称 获取Gin HTTP服务模块的依赖,外部使用时需自己断言,如:

userService = ioc.GetInternalDependency("user").(user.Service)

Jump to

Keyboard shortcuts

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