2016-11-16 55 views
-1

我有一個功能只能在特定條件下執行(例如角色=='管理員')。現在我用'if'聲明。但它可能是條件數量很高的情況,並且'如果'長定義看起來不那麼美觀。
Go(或與Go框架相關)中的可用機制允許實現中間件概念(操作過濾器)?

例如,ASP.NET MVC允許這樣做:轉:如何使用中間件模式?

[MyFilter] 
public ViewResult Index() 
{ 
    // Filter will be applied to this specific action method 
} 

所以,MyFilter()在單獨的類中實現允許更好的代碼的組合物和測試。

更新: 狂歡(用於轉到web框架)提供類似的功能與 攔截器(功能是由框架BEFORE或之後動作調用調用):https://revel.github.io/manual/interceptors.html

+1

動作過濾器的目標是什麼?無論哪種方式,我都會拒絕,Go傾向於簡單,這會讓我感覺更加複雜。 –

+0

動作過濾器是自定義屬性,它提供了聲明性方法來將控制前和動作後行爲添加到控制器的方法中。非常好的解釋(從ASP.NET MVC的角度)是在這裏:http://www.codeproject.com/Articles/577776/Filters-and-Attributes-in-ASPNET-MVC – olptkn

回答

1

這種事情通常與圍棋中間件完成。最簡單的是通過例子來說明:

package main 

import (
    "fmt" 
    "html" 
    "log" 
    "net/http" 
) 

func main() { 
    http.HandleFunc("/", handler) 
    http.HandleFunc("/foo", middleware(handler)) 

    log.Fatal(http.ListenAndServe(":8080", nil)) 
} 

func handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) 
} 

func middleware(next http.HandlerFunc) http.HandlerFunc { 
    return func(w http.ResponseWriter, r *http.Request) { 
     r.URL.Path = "/MODIFIED" 

     // Run the next handler 
     next.ServeHTTP(w, r) 
    } 
} 

正如你所看到的,中間件是一個函數:

  1. 接受http.HandlerFunc作爲參數;
  2. 返回http.HandlerFunc;
  3. 調用http.handlerFunc傳入

有了這個,你可以在「鏈」儘可能多的中間件,只要你喜歡基本技術:

http.HandleFunc("/foo", another(middleware(handler))) 

有這種模式的一些變體,以及大多數Go框架使用的語法略有不同,但概念通常是相同的。

相關問題