Etkili Bir Ara Katman Nasıl Oluşturulur
Yapısal Bileşenler
Ara katman genellikle iki bölümden oluşur:
-
İlk bölüm, ara katmanınızı başlattığınızda bir kez çalışır. Burası genel nesneleri, yapılandırma mantığını vb. kurduğunuz yerdir — uygulamanın ömrü boyunca yalnızca bir kez gerçekleşmesi gereken her şey.
-
İkinci bölüm her istekte çalışır. Örneğin, bir veritabanı ara katmanında, genel veritabanı nesnenizi istek context’ine enjekte edersiniz. Context’e yerleştirildikten sonra, diğer ara katmanlar ve işleyici fonksiyonlarınız onu alıp kullanabilir.
func funcName(params string) gin.HandlerFunc { // <--- // This is part one // ---> // Example initialization: validate input params if err := check(params); err != nil { panic(err) }
return func(c *gin.Context) { // <--- // This is part two // ---> // Example execution per request: inject into context c.Set("TestVar", params) c.Next() }}Yürütme Süreci
Aşağıdaki örnek koda bakalım:
func main() { router := gin.Default()
router.Use(globalMiddleware())
router.GET("/rest/n/api/*some", mid1(), mid2(), handler)
router.Run()}
func globalMiddleware() gin.HandlerFunc { fmt.Println("globalMiddleware...1")
return func(c *gin.Context) { fmt.Println("globalMiddleware...2") c.Next() fmt.Println("globalMiddleware...3") }}
func handler(c *gin.Context) { fmt.Println("exec handler.")}
func mid1() gin.HandlerFunc { fmt.Println("mid1...1")
return func(c *gin.Context) {
fmt.Println("mid1...2") c.Next() fmt.Println("mid1...3") }}
func mid2() gin.HandlerFunc { fmt.Println("mid2...1")
return func(c *gin.Context) { fmt.Println("mid2...2") c.Next() fmt.Println("mid2...3") }}Yukarıdaki Yapısal Bileşenler bölümüne göre, Gin sürecini çalıştırdığınızda her ara katmanın birinci bölümü önce çalışır ve aşağıdaki bilgileri yazdırır:
globalMiddleware...1mid1...1mid2...1Başlatma sırası şöyledir:
globalMiddleware...1 | vmid1...1 | vmid2...1Bir istek yaptığınızda — örneğin curl -v localhost:8080/rest/n/api/some — her ara katmanın ikinci bölümü sırasıyla çalışır ve aşağıdaki çıktıyı üretir:
globalMiddleware...2mid1...2mid2...2exec handler.mid2...3mid1...3globalMiddleware...3Başka bir deyişle, yürütme sırası şöyledir:
globalMiddleware...2 | vmid1...2 | vmid2...2 | vexec handler. | vmid2...3 | vmid1...3 | vglobalMiddleware...3