2016-11-16 51 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框架使用的语法略有不同,但概念通常是相同的。

相关问题