服务

服务即是被注入到处理器中的参数. 你可以映射一个服务到 全局 或者 请求 的级别.

全局映射

如果一个Martini实现了inject.Injector的接口, 那么映射成为一个服务就非常简单:

  1. db := &MyDatabase{}
  2. m := martini.Classic()
  3. m.Map(db) // *MyDatabase 这个服务将可以在所有的处理器中被使用到.
  4. // ...
  5. m.Run()

请求级别的映射

映射在请求级别的服务可以用martini.Context来完成:

  1. func MyCustomLoggerHandler(c martini.Context, req *http.Request) {
  2. logger := &MyCustomLogger{req}
  3. c.Map(logger) // 映射成为了 *MyCustomLogger
  4. }

映射值到接口

关于服务最强悍的地方之一就是它能够映射服务到接口. 例如说, 假设你想要覆盖http.ResponseWriter成为一个对象, 那么你可以封装它并包含你自己的额外操作, 你可以如下这样来编写你的处理器:

  1. func WrapResponseWriter(res http.ResponseWriter, c martini.Context) {
  2. rw := NewSpecialResponseWriter(res)
  3. c.MapTo(rw, (*http.ResponseWriter)(nil)) // 覆盖 ResponseWriter 成为我们封装过的 ResponseWriter
  4. }