injector

Martini 极好的 Go WEB 框架

a 夏天 提交于 2019-12-05 03:30:18
已知的其他框架看到的是传统OOP的影子, 到处充蚀 Class 风格的 OOP 方法. 而我们知道GoLang中是没有Class的. 笔者也曾努力用Go 的风格做WEB开发, 总感到力不从心. 写出的代码不能完全称之为框架, 到更像一个拷贝源码使用的应用. 要达到灵活需要修改源码. 直到看到了 Martini . 纯 GoLang 风格的框架出现了. 核心Injector Injector 是 Martini 的核心. 其代码非常简洁. 功能仅仅是通过反射包, 对函数进行参数类型自动匹配进行调用. 笔者曾经为完成类似的功能写了 typeless , 这是一个繁琐的高成本的实验品. Injector 把事情简单化了, Injector 假设函数的参数都具有不同的类型. 在WEB开发中的 HandlerFunc 通常都具有这样的形式. 因此通过反射包可以对参数进行自动的匹配并调用HandlerFunc, 当然事先要把所有可能使用到的参数 Map/MapTo 给 Injector 对象, 这很容易而且是可以预见的. 简洁的路由设计 Martini的路由 router.go 写的非常简洁实用, 可见作者使用正则的功力非常深厚. 举例: "/wap/:category/pow/**/:id" 匹配: "/wap/Golang/pow/Path1/ToPathN/Foo" 灵活的中间件

golang: Martini之inject源码分析

旧城冷巷雨未停 提交于 2019-12-04 02:20:29
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。在传统的程序设计过程中, 调用者是自己来决定使用哪些被调用者实现的。 但是在依赖注入模式中, 创建被调用者的工作不再由调用者来完成,因此称为控制反转; 创建被调用者实例的工作通常由注入器来完成,然后注入调用者,因此也称为依赖注入。 inject 是依赖注入的golang实现,作者是 codegangsta 。它能在运行时注入参数,调用方法。是Martini框架的基础核心。 我对依赖注入提取了以下2点性质: 由注入器注入属性。 由注入器创建被调用者实例。 在inject中,被调用者为func,因此注入属性也即对func注入实参(当然inject也可以注入struct,这样的话注入的属性就是struct中的已添加tag为`inject`的导出字段)。我们来看下普通的函数调用: package main import ( "fmt" ) func Say(name, gender string, age int) { fmt.Printf("My name is %s, gender is %s, age is %d!\n", name, gender, age) } func main() { Say("陈一回", "男", 20) } 上面的例子中