From f0b688ff8c88c12842b62d38a7a8515d067717e7 Mon Sep 17 00:00:00 2001 From: Muyao CHEN Date: Sat, 28 Sep 2024 22:48:33 +0200 Subject: [PATCH] Container: Add Gin web service provider --- framework/provider.go | 1 + main.go | 12 ++++++++++-- providers/webserver/contract.go | 3 +++ providers/webserver/provider.go | 25 +++++++++++++++++++++++++ providers/webserver/service.go | 25 +++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 providers/webserver/contract.go create mode 100644 providers/webserver/provider.go create mode 100644 providers/webserver/service.go diff --git a/framework/provider.go b/framework/provider.go index c834916..c69e094 100644 --- a/framework/provider.go +++ b/framework/provider.go @@ -16,6 +16,7 @@ type ServiceProvider interface { InstantiateLater() bool // Params defines the parameters needed to instantiate a service. + // NOTE: First one should always be the container. Params(Container) []interface{} // Name is the name of the service provider diff --git a/main.go b/main.go index 0aedda4..6d7570b 100644 --- a/main.go +++ b/main.go @@ -10,11 +10,19 @@ import ( "syscall" "time" - "github.com/gin-gonic/gin" + "git.vinchent.xyz/vinchent/go-web/framework" + "git.vinchent.xyz/vinchent/go-web/providers/webserver" ) func main() { - core := gin.New() + container := framework.NewGoWebContainer() + webServiceProvider := &webserver.WebSrvProvider{} + + container.Bind(webServiceProvider) + + goWebGin := container.JustGet(webserver.WebSrvName).(*webserver.GoWebGin) + + core := goWebGin.Engine registerRouter(core) server := &http.Server{ Addr: ":8080", diff --git a/providers/webserver/contract.go b/providers/webserver/contract.go new file mode 100644 index 0000000..6773849 --- /dev/null +++ b/providers/webserver/contract.go @@ -0,0 +1,3 @@ +package webserver + +const WebSrvName = "srv:gin" diff --git a/providers/webserver/provider.go b/providers/webserver/provider.go new file mode 100644 index 0000000..07e7f5d --- /dev/null +++ b/providers/webserver/provider.go @@ -0,0 +1,25 @@ +package webserver + +import "git.vinchent.xyz/vinchent/go-web/framework" + +type WebSrvProvider struct{} + +func (p *WebSrvProvider) Name() string { + return WebSrvName +} + +func (p *WebSrvProvider) Register(c framework.Container) framework.NewInstance { + return NewGoWebGin +} + +func (p *WebSrvProvider) Init(c framework.Container) error { + return nil +} + +func (p *WebSrvProvider) InstantiateLater() bool { + return false +} + +func (p *WebSrvProvider) Params(c framework.Container) []interface{} { + return []interface{}{c} +} diff --git a/providers/webserver/service.go b/providers/webserver/service.go new file mode 100644 index 0000000..9107605 --- /dev/null +++ b/providers/webserver/service.go @@ -0,0 +1,25 @@ +package webserver + +import ( + "git.vinchent.xyz/vinchent/go-web/framework" + "github.com/gin-gonic/gin" +) + +type GoWebGin struct { + container framework.Container + Engine *gin.Engine +} + +func NewGoWebGin(params ...interface{}) (interface{}, error) { + paramsLen := len(params) + container := params[0].(framework.Container) + + ginOpts := make([]gin.OptionFunc, paramsLen-1) + for _, param := range params[1:] { + ginOpts = append(ginOpts, param.(gin.OptionFunc)) + } + return &GoWebGin{ + container: container, + Engine: gin.New(ginOpts...), + }, nil +}