Compare commits

..

3 Commits

Author SHA1 Message Date
Muyao CHEN
f0b688ff8c Container: Add Gin web service provider 2024-09-28 22:54:00 +02:00
Muyao CHEN
f866f18cfd Container: create service container and service provider 2024-09-28 22:54:00 +02:00
Muyao CHEN
722e8191a9 GoWeb: Remove everything to use Gin 2024-09-28 22:53:41 +02:00
11 changed files with 376 additions and 53 deletions

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "framework/gin"]
path = framework/gin
url = gitea@git.vinchent.xyz:vinchent/gin.git

195
framework/container.go Normal file
View File

@ -0,0 +1,195 @@
package framework
import (
"fmt"
"io"
"sync"
)
type Container interface {
// Bind binds a service provider to the container.
//
// If the service exists, the old one will be replaced by the new one.
// No error is returned in this case.
//
// Return any Init() error.
Bind(provider ServiceProvider) error
// IsBound returns true the provider is bound to the container.
IsBound(name string) bool
// Get gets or creates a service by its name.
//
// Return error if the service cannot be initiated or doesn't exist.
Get(name string) (interface{}, error)
// JustGet gets a service, return nil if error.
JustGet(name string) interface{}
// GetExisted gets an initiated service by its name.
GetExisted(name string) interface{}
// MakeNew creates a new instance of the service with different parameters.
//
// Used for non singleton services.
MakeNew(name string, params []interface{}) (interface{}, error)
}
type GoWebContainer struct {
// Must implement Container interfaces.
Container
// Service providers by name.
providers map[string]ServiceProvider
// Instantiated services by name.
instances map[string]interface{}
// RWMutex to protect the changes in container.
mu sync.RWMutex
}
func errUnknownService(name string) error {
return fmt.Errorf("service %q is not registered in the container", name)
}
func NewGoWebContainer() *GoWebContainer {
return &GoWebContainer{
providers: map[string]ServiceProvider{},
instances: map[string]interface{}{},
mu: sync.RWMutex{},
}
}
func (c *GoWebContainer) PrintProviders(w io.Writer) {
ret := make([]string, len(c.providers))
for _, provider := range c.providers {
name := provider.Name()
ret = append(ret, name)
}
fmt.Fprintf(w, "%v", ret)
}
func (c *GoWebContainer) Bind(provider ServiceProvider) error {
c.bindProvider(provider)
// Instantiate Later ?
if provider.InstantiateLater() {
return nil
}
// Instantiate now !
_, err := c.instantiate(provider, nil)
if err != nil {
return err
}
return nil
}
func (c *GoWebContainer) bindProvider(provider ServiceProvider) {
c.mu.Lock()
defer c.mu.Unlock()
name := provider.Name()
c.providers[name] = provider
}
func (c *GoWebContainer) IsBound(name string) bool {
return c.getServiceProvider(name) != nil
}
func (c *GoWebContainer) getServiceProvider(name string) ServiceProvider {
c.mu.RLock()
defer c.mu.RUnlock()
provider, ok := c.providers[name]
if ok {
return provider
}
return nil
}
func (c *GoWebContainer) Get(name string) (interface{}, error) {
return c.makeServiceInstance(name, nil, false)
}
func (c *GoWebContainer) GetExisted(name string) interface{} {
return c.getServiceInstance(name)
}
func (c *GoWebContainer) JustGet(name string) interface{} {
ins, err := c.makeServiceInstance(name, nil, false)
if err != nil {
return nil
}
return ins
}
func (c *GoWebContainer) MakeNew(name string, params []interface{}) (interface{}, error) {
return c.makeServiceInstance(name, params, true)
}
func (c *GoWebContainer) getServiceInstance(name string) interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
instance, ok := c.instances[name]
if ok {
return instance
}
return nil
}
func (c *GoWebContainer) makeServiceInstance(
name string,
params []interface{},
forceNew bool,
) (interface{}, error) {
provider := c.getServiceProvider(name)
if provider == nil {
return nil, errUnknownService(name)
}
if forceNew {
return c.instantiate(provider, params)
}
instance := c.getServiceInstance(name)
if instance != nil {
return instance, nil
}
// create a new instance
return c.instantiate(provider, params)
}
// instantiate instantiates a new instance.
// If no params are provided, then default params are used.
func (c *GoWebContainer) instantiate(
provider ServiceProvider,
params []interface{},
) (interface{}, error) {
c.mu.Lock()
defer c.mu.Unlock()
if err := provider.Init(c); err != nil {
// TODO: Error should be wrapped.
return nil, err
}
if params == nil {
params = provider.Params(c)
}
construct := provider.Register(c)
instance, err := construct(params...)
if err != nil {
// TODO: Error should be wrapped.
return nil, err
}
c.instances[provider.Name()] = instance
return instance, nil
}

View File

@ -0,0 +1,88 @@
package framework
import (
"log"
"reflect"
"testing"
)
// {{{ contract
const DummyProviderName = "container:test"
type IDummyService interface {
GetDummy() DummyStruct
}
type DummyStruct struct {
Name string
}
// }}}
// {{{ provider
type DummyServiceProvider struct{}
func (p *DummyServiceProvider) Name() string {
return DummyProviderName
}
func (p *DummyServiceProvider) Register(c Container) NewInstance {
return NewDummyService
}
func (p *DummyServiceProvider) Init(c Container) error {
log.Println("init")
return nil
}
func (p *DummyServiceProvider) InstantiateLater() bool {
return true
}
func (p *DummyServiceProvider) Params(c Container) []interface{} {
return []interface{}{c}
}
// }}}
// {{{ service
type DummyService struct {
IDummyService
// parameters
c Container
}
func (d *DummyService) GetDummy() DummyStruct {
return DummyStruct{
Name: "Dummy!",
}
}
func NewDummyService(params ...interface{}) (interface{}, error) {
c := params[0].(Container)
log.Println("new dummy service")
return &DummyService{c: c}, nil
}
// }}}
func TestBind(t *testing.T) {
container := NewGoWebContainer()
provider := &DummyServiceProvider{}
container.Bind(provider)
dummyService := container.JustGet(DummyProviderName).(IDummyService)
want := DummyStruct{
Name: "Dummy!",
}
got := dummyService.GetDummy()
if !reflect.DeepEqual(want, got) {
t.Errorf("want %v, got %v ", want, got)
}
}

@ -1 +0,0 @@
Subproject commit f05f966a0824b1d302ee556183e2579c91954266

24
framework/provider.go Normal file
View File

@ -0,0 +1,24 @@
package framework
// NewInstance defines the function to create a new instance for a service.
type NewInstance func(...interface{}) (interface{}, error)
// ServiceProvider is the interface for a service provider
type ServiceProvider interface {
// Register a service into the service container, return a NewInstance constructer
Register(Container) NewInstance
// Init is called when instantiating the service.
Init(Container) error
// InstantiateLater decides if the service is instantiated at register phase.
// If true, then this service shall be instantiated later.
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
Name() string
}

16
go.mod
View File

@ -14,34 +14,24 @@ require (
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.20.0 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/onsi/ginkgo/v2 v2.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/quic-go v0.43.1 // indirect
github.com/rogpeppe/go-internal v1.9.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
go.uber.org/mock v0.4.0 // indirect
golang.org/x/arch v0.8.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.16.0 // indirect
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
google.golang.org/protobuf v1.34.1 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
replace github.com/gin-gonic/gin => ./framework/gin

37
go.sum
View File

@ -2,9 +2,6 @@ github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc
github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
@ -17,8 +14,8 @@ github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uq
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
@ -27,18 +24,11 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
@ -58,18 +48,11 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/quic-go v0.43.1 h1:fLiMNfQVe9q2JvSsiXo4fXOEguXHGGl9+6gLp4RPeZQ=
github.com/quic-go/quic-go v0.43.1/go.mod h1:132kz4kL3F9vxhW3CtQJLDVwcFe5wdWeJXXijhsO57M=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@ -77,7 +60,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
@ -89,32 +71,19 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o=
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

12
main.go
View File

@ -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",

View File

@ -0,0 +1,3 @@
package webserver
const WebSrvName = "srv:gin"

View File

@ -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}
}

View File

@ -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
}