Browse Source

Added some DI polish

Frederic G. MARAND 1 year ago
parent
commit
66e1a7d954
2 changed files with 30 additions and 21 deletions
  1. 27 9
      cmd/fizzbuzz/di.go
  2. 3 12
      cmd/fizzbuzz/main.go

+ 27 - 9
cmd/fizzbuzz/di.go

@@ -15,6 +15,28 @@ import (
 	"code.osinet.fr/fgm/lbc/web"
 )
 
+// containers wraps an [izidic.Container] to provide typed services accessors,
+// obviating the need to type-assert calls to Service.
+type container struct {
+	*izidic.Container
+}
+
+func (c *container) Config() *web.Config {
+	return c.MustService("config").(*web.Config)
+}
+
+func (c *container) Logger() *log.Logger {
+	return c.MustService("logger").(*log.Logger)
+}
+
+func (c *container) Stats() *web.Stats {
+	return c.MustService("stats").(*web.Stats)
+}
+
+func (c *container) Web() *web.Server {
+	return c.MustService("web").(*web.Server)
+}
+
 // 12-factor/XI: log to stdout.
 func loggerService(dic *izidic.Container) (any, error) {
 	sw, err := dic.Param("writer")
@@ -66,16 +88,12 @@ func statsService(dic *izidic.Container) (any, error) {
 }
 
 func webService(dic *izidic.Container) (any, error) {
-	logger := dic.MustService("logger").(*log.Logger)
-	config := dic.MustService("config").(*web.Config)
-	stats := dic.MustService("stats").(*web.Stats)
-
-	ctx := context.Background()
+	wd := container{dic}
 	return &web.Server{
-		BaseContext: ctx,
-		Config:      config,
-		Logger:      logger,
-		Stats:       stats,
+		BaseContext: context.Background(),
+		Config:      wd.Config(),
+		Logger:      wd.Logger(),
+		Stats:       wd.Stats(),
 	}, nil
 }
 

+ 3 - 12
cmd/fizzbuzz/main.go

@@ -1,25 +1,16 @@
 package main
 
 import (
-	"log"
 	"os"
 
 	"code.osinet.fr/fgm/lbc/domain"
-	"code.osinet.fr/fgm/lbc/web"
 )
 
 func main() {
-	dic := resolve(os.Stdout, os.Args)
+	dic := container{resolve(os.Stdout, os.Args)}
 
-	logger := dic.MustService("logger").(*log.Logger)
-	s, err := dic.Service("web")
-	if err != nil {
-		logger.Fatal(err)
-	}
-	server, ok := s.(*web.Server)
-	if !ok {
-		logger.Fatalf("incorrect type for web server: %T", s)
-	}
+	logger := dic.Logger()
+	server := dic.Web()
 	if err := server.Serve(make(chan domain.Empty)); err != nil {
 		logger.Fatal(err)
 	}